zsh menyediakan beberapa fungsi kait yang bagus , termasuk chpwd
menjalankan fungsi setelah pengguna mengubah direktori.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Saya mencoba untuk meniru di bash
Kendala:
- Itu harus bekerja di kedua shell interaktif dan non-interaktif, yang saya pikir berarti itu tidak dapat bergantung pada sesuatu seperti
$PROMPT_COMMAND
- Itu tidak dapat mendefinisikan ulang
cd
, karena saya ingin itu berfungsi untuk perintah apa pun yang mengubah direktori (misalnya,pushd
danpopd
) - Itu harus dijalankan setelah perintah pengguna, jadi
trap "my_function" DEBUG
tidak bekerja, kecuali saya entah bagaimana bisa mengatakan di sana, "pertama jalankan$BASH_COMMAND
kita terjebak, kemudian juga melakukan ini ..." Saya melihat bahwa saya dapat menghindari menjalankan otomatis$BASH_COMMAND
jikaextdebug
diaktifkan dan fungsi trap mengembalikan 1, tetapi saya tidak berpikir saya ingin memaksakanextdebug
, dan kembali1
untuk perintah yang berhasil (tetapi dimodifikasi) tampaknya salah.
Bagian terakhir - "jalankan setelah perintah pengguna" - adalah apa yang saat ini membuat saya bingung. Jika saya dapat menjalankan fungsi setelah setiap perintah, saya dapat memeriksanya apakah direktori telah berubah sejak kami terakhir memeriksa. Misalnya:
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
}
Apakah saya di jalur yang benar, atau ada cara yang lebih baik? Bagaimana saya bisa menjalankan perintah dalam bash setelah pengguna mengubah direktori?
cd
sebagai prinsip.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Tolong jangan mengubah perintah Unix tepercaya.
bash
, yang bekerja hampir sama pada semua sistem operasi yang berjalan.
cd
,pushd
danpopd
? Berapa banyak cara lain untuk mengubah direktori?