zsh zapewnia pewne ładny funkcje przechwytujące , w tym chpwd
na prowadzenie funkcji, gdy użytkownik zmienia katalogów.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Staram się to naśladować.
Ograniczenia:
- Musi działać zarówno w interaktywnych, jak i nieinteraktywnych powłokach, co moim zdaniem oznacza, że nie może polegać na czymś takim
$PROMPT_COMMAND
- Nie można przedefiniować
cd
, ponieważ chcę, aby działał dla każdego polecenia zmieniającego katalogi (np.pushd
Ipopd
) - Musi działać po komendzie użytkownika, więc
trap "my_function" DEBUG
nie działa, chyba że mogę w jakiś sposób powiedzieć: „najpierw uruchom$BASH_COMMAND
pułapkę, a następnie również zrób to ...”. Widzę, że mogę uniknąć automatycznego uruchamiania,$BASH_COMMAND
jeśliextdebug
włączono a funkcja pułapki zwraca 1, ale nie sądzę, że chcę wymusićextdebug
, a powrót1
do udanej (ale zmodyfikowanej) komendy wydaje się niewłaściwy.
Ostatnia część - „biegnij za poleceniem użytkownika” - jest tym, co mnie obecnie zaskoczyło. Gdybym można uruchomić funkcję po każdym poleceniu, może mam to sprawdzić, czy katalog został zmieniony od ostatniego sprawdzenia. Na przykład:
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
}
Czy jestem na dobrej drodze, czy jest lepszy sposób? Jak mogę uruchomić polecenie w bash po tym, jak użytkownik zmieni katalogi?
cd
.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Proszę nie zmieniać zaufanych poleceń Uniksa.
bash
, który działa prawie tak samo na wszystkich systemach operacyjnych, na których działa.
cd
,pushd
ipopd
? Ile jest innych sposobów zmiany katalogu?