进入目录时执行 bash 脚本

进入目录时执行 bash 脚本

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

答案1

您可以创建cd一个函数(andpoppushd),并让它检测您是否进入该特定目录。

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
}

答案2

迪伦夫可能就是您正在寻找的。

direnv是你的 shell 的扩展。它通过一项新功能增强了现有的 shell,该功能可以根据当前目录加载和卸载环境变量。

下面是一个取自官方文档的例子:

$ 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

答案3

这是我的cd功能

function cd()
{
    if [ -f .exit.sh ]; then
        source .exit.sh;
    fi

    if [ -z $* ]; then
        builtin cd ~
    else
        builtin cd "$*"
    fi

    if [ -f .enter.sh ]; then
        source .enter.sh;
    fi
}

然后你可以在“.enter.sh”或“.exit.sh”中编写脚本。

答案4

翁迪尔是在终端中输入目录时运行脚本的另一种替代方法。

相关内容