Я хотел бы выполнить конкретную функцию удара, когда я ввожу новый каталог. Somethink как:
alias cd="cd $@ && myfunction"
$@
не работает там, и добавление, что обратная косая черта не помогает. Я также немного волнуюсь по поводу питания с CD, и было бы хорошо, если бы это работало на другие команды, которые изменили каталог, как pushd
и popd
.
Какие-либо лучшие псевдонимы/команды?
Самое простое решение, которое я могу придумать, - это
myfunction() {
if [ "$PWD" != "$MYOLDPWD" ]; then
MYOLDPWD="$PWD";
# strut yer stuff here..
fi
}
export PROMPT_COMMAND=myfunction
Это должно сработать. Он будет работать со всеми командами и сработает до отображения подсказки.
Я написал сценарий ZSH, использующий функцию обратного вызова chpwd
для исходных конфигураций ZSH проекта. Я не уверен, работает ли это с Bash, но я думаю, что стоит попробовать. Если он не найдет файл сценария в каталоге, в который вы переходите, он будет проверять родительские каталоги, пока не найдет сценарий для источника (или пока он не достигнет /
). Он также вызывает функцию unmagic
при выходе из каталога cd'ом, которая позволяет вам очистить среду при выходе из проекта.
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
}
Псевдонимы не принимают параметры. Вы должны использовать функцию. Нет необходимости выполнять ее автоматически каждый раз, когда выдается приглашение.
function cd () { builtin cd "$@" && myfunction; }
Ключевое слово builtin
позволяет переопределить встроенный модуль Bash без создания рекурсии. Кавычки в параметре позволяют использовать его в случае наличия пробелов в именах каталогов.
В документации по Bash говорится:
Почти для всех целей функции оболочки предпочтительнее псевдонимов.