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? Скільки інших способів змінити каталог?