zsh cung cấp một số hàm hook đẹp , bao gồm chpwd
để chạy một hàm sau khi người dùng thay đổi thư mục.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Tôi đang cố gắng mô phỏng điều đó trong bash.
Các ràng buộc:
- Nó phải hoạt động trong cả vỏ tương tác và không tương tác, mà tôi nghĩ có nghĩa là nó không thể dựa vào thứ gì đó như
$PROMPT_COMMAND
- Nó không thể xác định lại
cd
, vì tôi muốn nó hoạt động cho bất kỳ lệnh nào thay đổi thư mục (ví dụ:pushd
vàpopd
) - Nó phải chạy theo lệnh của người dùng, vì vậy
trap "my_function" DEBUG
không hoạt động, trừ khi tôi có thể nói bằng cách nào đó, "trước tiên hãy chạy$BASH_COMMAND
chúng tôi bị mắc kẹt, sau đó cũng làm điều này ..." Tôi thấy rằng tôi có thể tránh tự động chạy$BASH_COMMAND
nếuextdebug
được bật và hàm bẫy trả về 1, nhưng tôi không nghĩ rằng tôi muốn ép buộcextdebug
và quay lại1
lệnh thành công (nhưng đã sửa đổi) có vẻ sai.
Phần cuối cùng - "chạy theo lệnh của người dùng" - là phần hiện tại khiến tôi bối rối. Nếu tôi có thể chạy một chức năng sau mỗi lệnh, tôi có thể kiểm tra xem thư mục đã thay đổi kể từ lần kiểm tra cuối cùng chưa. Ví dụ:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
Tôi đang đi đúng hướng, hay có cách nào tốt hơn? Làm thế nào tôi có thể chạy một lệnh trong bash sau khi người dùng thay đổi thư mục?
cd
theo nguyên tắc.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Xin vui lòng không thay đổi các lệnh Unix đáng tin cậy.
bash
, cái này hoạt động khá giống nhau trên tất cả các hệ điều hành mà nó chạy.
cd
,pushd
vàpopd
? Có bao nhiêu cách khác để thay đổi thư mục?