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.pushdVepopd) - 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_COMMANDsonra da bunu, tuzağa biz ..." Ben otomatik çalışmasını önleyebilirsiniz görüyoruz arasında$BASH_COMMANDiseextdebugetkindir ve tuzak işlevi 1 döndürür, ancak zorlamak istediğimi sanmıyorumextdebugve1baş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?
cdprensip 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,pushdvepopd? Dizini değiştirmek için başka kaç yol var?