zsh надає кілька приємних функцій гака , в тому числі chpwd
для запуску функції після зміни користувачем каталогів.
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Я намагаюся наслідувати це в баш.
Обмеження:
- Він повинен працювати як в інтерактивних, так і в неінтерактивних оболонках, що, на мою думку, означає, що він не може покладатися на щось подібне
$PROMPT_COMMAND
- Він не може перевизначити
cd
, тому що я хочу, щоб він працював для будь-якої команди, яка змінює каталоги (наприклад,pushd
іpopd
) - Він повинен працювати після команди користувача, тому
trap "my_function" DEBUG
не працює, якщо я не можу якось сказати там: "спочатку запустіть$BASH_COMMAND
ми в пастці, а потім зробіть це ..." Я бачу, що я можу уникнути автоматичного запуску,$BASH_COMMAND
якщоextdebug
ввімкнено і функція пастки повертає 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
? Скільки інших способів змінити каталог?