Выполнение функции bash при вводе каталога
Я хотел бы выполнить определенную функцию bash при вводе нового каталога. Что-то вроде:
alias cd="cd [email protected] && myfunction"
[email protected]
там не работает, и добавление обратной косой черты не помогает. Я также немного беспокоюсь о том, чтобы возиться с cd, и было бы неплохо, если бы это сработало для других команд, которые меняли каталог, например pushd
и popd
.
Любые лучшие псевдонимы/команды?
Ответы
Ответ 1
Самое легкое решение, которое я могу придумать, - это
myfunction() {
if [ "$PWD" != "$MYOLDPWD" ]; then
MYOLDPWD="$PWD";
# strut yer stuff here..
fi
}
export PROMPT_COMMAND=myfunction
Это должно быть сделано. Он будет работать со всеми командами и будет запущен до появления подсказки.
Ответ 2
Псевдонимы не принимают параметры. Вы должны использовать функцию. Нет необходимости выполнять его автоматически при каждом выпуске приглашения.
function cd () { builtin cd "[email protected]" && myfunction; }
Ключевое слово builtin
позволяет вам переопределить встроенный Bash без создания рекурсии. Цитирование параметра заставляет его работать, если в именах каталогов есть пробелы.
Bash docs говорят:
Для почти каждой цели функции оболочки предпочтительнее над псевдонимами.
Ответ 3
Есть несколько других версий этого, в том числе
- smartcd, который я написал, и имеет массу функций, включая сохранение шаблонов и сохранение временных переменных
- ondir, который меньше и намного проще
Оба из них поддерживают как bash, так и zsh
Ответ 4
Я написал сценарий ZSH, использующий функцию обратного вызова chpwd
для создания исходных конфигураций ZSH проекта. Я не уверен, что это работает с Bash, но я думаю, что стоит попробовать. Если он не найдет файл сценария в каталоге, в который вы переходите, он будет проверять родительские каталоги, пока не найдет сценарий для источника (или пока он не достигнет /
). Он также вызывает функцию unmagic
при cd'ing вне каталога, которая позволяет вам очистить вашу среду при выходе из проекта.
http://github.com/jkramer/home/blob/master/.zsh/func/magic
Пример для "волшебного" скрипта:
export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b
ctags -R --languages=Perl $PWD # update ctags file when entering the project directory
export PERL5LIB="$BASE/lib"
# function that starts the catalyst server
function srv {
perl $BASE/script/${PROJECT_NAME}_server.pl
}
# clean up
function unmagic {
unfunction src
unset PERL5LIB
}