zsh предоставляет несколько приятных функций ловушки , в том числе chpwd
для запуска функции после того, как пользователь меняет каталоги.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Я пытаюсь подражать этому в bash.
Ограничения:
- Он должен работать как в интерактивных, так и в неинтерактивных оболочках, что, я думаю, означает, что он не может полагаться на что-то вроде
$PROMPT_COMMAND
- Он не может переопределить
cd
, потому что я хочу, чтобы он работал для любой команды, которая изменяет каталоги (например,pushd
иpopd
) - Он должен запускаться после команды пользователя, поэтому
trap "my_function" DEBUG
не работает, если я не могу как-то сказать там: «сначала запусти$BASH_COMMAND
мы в ловушке, а затем сделай это ...» Я вижу, что могу избежать автоматического запуска,$BASH_COMMAND
еслиextdebug
включен и функция trap возвращает 1, но я не думаю, что хочу форсироватьextdebug
, и возвращение1
для успешной (но измененной) команды кажется неправильным.
Последняя часть - «беги за командой пользователя» - это то, что меня сейчас озадачило. Если я могу запускать функцию после каждой команды, я могу проверить, изменился ли каталог с момента последней проверки. Например:
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
}
Я на правильном пути или есть лучший путь? Как я могу запустить команду в bash после того, как пользователь сменит каталоги?
cd
в качестве принципа.
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
, не меняйте доверенные команды Unix.
bash
, которая работает практически одинаково на всех операционных системах, на которых она работает.
cd
,pushd
иpopd
? Сколько еще способов изменить каталог?