22

当我进入一个新目录时,我想执行一个特定的 bash 函数。有人认为:

alias cd="cd $@ && myfunction"

$@在那里不起作用,添加反斜杠也无济于事。我也有点担心弄乱 cd,如果这适用于其他更改目录的命令,比如pushdpopd.

有更好的别名/命令吗?

4

4 回答 4

24

别名不接受参数。你应该使用一个函数。无需每次发出提示时自动执行。

function cd () { builtin cd "$@" && myfunction; }

builtin关键字允许您在不创建递归的情况下重新定义 Bash 内置函数。引用参数使其在目录名称中有空格的情况下起作用。

Bash 文档说:

对于几乎所有目的,shell 函数都比别名更受欢迎。

于 2010-07-29T15:09:34.553 回答
20

我能想出的最简单的解决方案是这个

myfunction() {
  if [ "$PWD" != "$MYOLDPWD" ]; then
    MYOLDPWD="$PWD";
    # strut yer stuff here..
  fi
}

export PROMPT_COMMAND=myfunction

那应该这样做。它适用于所有命令,并在显示提示之前被触发。

于 2010-07-29T08:54:48.340 回答
8

还有其他一些版本,包括

  • smartcd,我写的,有很多特性,包括模板和临时变量保存
  • ondir,它更小更简单

这两个都支持 bash 和 zsh

于 2012-01-01T01:37:23.277 回答
2

我编写了一个 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
}
于 2010-07-29T10:18:43.093 回答