进入目录后执行bash功能

时间:2010-07-29 08:44:55

标签: bash function cd

我想在输入新目录时执行特定的bash功能。有些想法:

alias cd="cd $@ && myfunction"

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

任何更好的别名/命令?

4 个答案:

答案 0 :(得分:20)

别名不接受参数。你应该使用一个功能。每次发出提示时都不需要自动执行它。

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

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

Bash docs说:

  

对于几乎所有目的,shell函数优先于别名。

答案 1 :(得分:19)

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

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

export PROMPT_COMMAND=myfunction

应该这样做。它将与所有命令一起使用,并在显示提示之前触发。

答案 2 :(得分:7)

还有其他一些版本,包括

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

这两个都支持bash和zsh

答案 3 :(得分:2)

我编写了一个ZSH脚本,它利用回调函数chpwd来获取项目特定的ZSH配置。我不确定它是否适用于Bash,但我认为值得一试。如果它没有在您正在进入的目录中找到脚本文件,它将检查父目录,直到找到要发送的脚本(或直到它到达/)。当cd退出目录时,它还会调用函数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
}