zsh , kullanıcı dizinleri değiştirdikten sonra bir işlevi çalıştırmak da dahil olmak üzere bazı güzel kanca işlevleri sağlar chpwd
.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Bunu bash'da taklit etmeye çalışıyorum.
Kısıtlamalar:
- Hem interaktif hem de interaktif olmayan mermilerde çalışmalı, bence bu gibi bir şeye güvenemez
$PROMPT_COMMAND
- Yeniden tanımlayamaz
cd
, çünkü dizinleri değiştiren herhangi bir komut için çalışmasını istiyorum (ör.pushd
Vepopd
) - Bu çalıştırmalısınız sonra böylece, kullanıcının komutuyla
trap "my_function" DEBUG
, ben bir şekilde orada söyleyebiliriz sürece, değil nasıl çalışır "ilk çalıştırmak$BASH_COMMAND
sonra da bunu, tuzağa biz ..." Ben otomatik çalışmasını önleyebilirsiniz görüyoruz arasında$BASH_COMMAND
iseextdebug
etkindir ve tuzak işlevi 1 döndürür, ancak zorlamak istediğimi sanmıyorumextdebug
ve1
başarılı (ama değiştirilmiş) bir komut için geri dönmek yanlış görünüyor.
Son bölüm - "kullanıcının komutundan sonra koş" - şu anda beni güdük. Ben ise edebilir her komutun ardından bir işlev çalıştırın, bunun son kontrol beri dizin değişip değişmediğini kontrol olabilir. Örneğin:
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
}
Doğru yolda mıyım yoksa daha iyi bir yol var mı? Kullanıcı dizinleri değiştirdikten sonra bash komutunu nasıl çalıştırabilirim?
cd
prensip olarak yeniden tanımlanmadığını özellikle listelediği açık kaynaklı bir projeye girmesi amaçlanmıştır .
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Lütfen güvenilir Unix komutlarını değiştirmeyin.
bash
üzerinde çalıştığı tüm işletim sistemlerinde hemen hemen aynı şekilde çalışan, özellikle soruyor gibi görünüyorsunuz .
cd
,pushd
vepopd
? Dizini değiştirmek için başka kaç yol var?