当我进入一个新目录时,我想执行一个特定的 bash 函数。有人认为:
alias cd="cd $@ && myfunction"
$@
在那里不起作用,添加反斜杠也无济于事。我也有点担心弄乱 cd,如果这适用于其他更改目录的命令,比如pushd
和popd
.
有更好的别名/命令吗?
别名不接受参数。你应该使用一个函数。无需每次发出提示时自动执行。
function cd () { builtin cd "$@" && myfunction; }
该builtin
关键字允许您在不创建递归的情况下重新定义 Bash 内置函数。引用参数使其在目录名称中有空格的情况下起作用。
Bash 文档说:
对于几乎所有目的,shell 函数都比别名更受欢迎。
我能想出的最简单的解决方案是这个
myfunction() {
if [ "$PWD" != "$MYOLDPWD" ]; then
MYOLDPWD="$PWD";
# strut yer stuff here..
fi
}
export PROMPT_COMMAND=myfunction
那应该这样做。它适用于所有命令,并在显示提示之前被触发。
我编写了一个 ZSH 脚本,利用回调函数chpwd
来获取项目特定的 ZSH 配置。我不确定它是否适用于 Bash,但我认为值得一试。如果它在您正在进入的目录中找不到脚本文件,它将检查父目录,直到找到要源的脚本(或直到它到达/
)。当 cd'ing 退出目录时它还会调用一个函数unmagic
,它允许您在离开项目时清理您的环境。
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
}