输入目录时执行bash脚本


40

进入目录时执行脚本的最佳方法是什么?
当我进入一个新目录时,我希望bash像RVM一样执行projectSettings.bash脚本。


2
进入每个目录,还是选定的目录?每个脚本是否相同?
enzotib

每个目录。目录名为projectSettings.bash的脚本(如果存在)。
MageProspero 2011年

Answers:


46

您可以创建cd一个函数(和poppushd),并使其检测是否输入了该特定目录。

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
  # do whatever it takes to undo the effect of projectSettings.bash,
  # e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
  case $PWD in
    /some/directory|/some/other/directory) . ./projectSettings.bash;;
    *) unset_all_project_settings;;
  esac
}

不要在您未列入白名单的目录中执行此操作,因为这样会使有人很容易诱骗您运行任意代码-向您发送一个存档,然后将其解压缩,更改为它创建的目录,然后现在运行攻击者的代码。

我不推荐这种方法,因为这意味着即使您出于与项目工作无关的原因进入该目录,脚本也将被执行。我建议使用一个特定的功能来更改项目目录并提供设置脚本。

myproj () {
  cd /some/directory && . ./projectSettings.bash
}

1
我才刚开始使用Ruby。RVM工具完全在Bash中,并且是我所见过的最好的Bash魔术之一。我认为答案有点愚蠢,因为您可以做的绝对糟糕的事情之一就是骑类似的东西cd,毫无疑问,这是一种更好的方法。甚至使用$ PROMPT_COMMAND更好!
MageProspero 2011年

3
我完全错了,对不起。RVM使CD超载。
MageProspero 2011年

5
(从此注释线程中删除了一些切向的pro / anti-Ruby东西)
Michael Mrozek

1
在projectSettings.bash中,建议您添加一个标志变量,以免退出/重新进入目录时不重复初始化。因此,请将所有内容包含在中if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi。这是为了避免在执行PATH = / mytools / bin:$ PATH类型的初始化操作时出现问题。
蜘蛛

5
@spider如果离开目录,应该有某种未设置的机制。如果您离开并重新输入,则应恢复设置!
吉尔斯(Gillles)“所以-别再邪恶了”

0

direnv可能是您想要的。

这是一个取自官方文档的示例:

$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.