5

有没有办法在进入特定目录时获取特定文件来设置环境?有点像 rvm 所做的,但更通用。

4

3 回答 3

19

恕我直言,您不应为此使用别名,而应在任何目录更改中添加挂钩:

autoload -U add-zsh-hook
load-local-conf() {
     # check file exists, is regular file and is readable:
     if [[ -f .source_me && -r .source_me ]]; then
       source .source_me
     fi
}
add-zsh-hook chpwd load-local-conf

此挂钩函数将在任何目录更改时运行。

FWIW,如果您希望在触发挂钩的情况下更改目录,请使用cd -q dirname

于 2013-06-12T08:12:42.040 回答
2

您想要实现的是为特定目录设置环境变量。

与为此设计的其他工具相比,direnv是其中最好的。主要好处之一是当您退出该目录时,它支持unload环境变量。

direnv是shell的环境切换器。它知道如何挂钩到 bash、zsh、tcsh、fish shell 和 elvish 以根据当前目录加载或卸载环境变量。这允许特定于项目的环境变量,而不会弄乱~/.profile文件。

direnv其他类似工具之间的区别:

  • direnv用 Go 编写,与用 Python 编写的对应物相比更快
  • direnv支持从特定目录退出时卸载环境变量
  • direnv覆盖许多贝壳

类似项目

  • 环境模块- 最古老的(以一种好的方式)环境加载系统之一
  • autoenv - 轻量级;不支持卸载;用 Python 写的慢
  • zsh-autoenv - autoenv 和smartcd的功能丰富的组合:进入/离开事件,嵌套,存储(仅限 Zsh)。
  • asdf - 具有插件系统的纯 bash 解决方案
于 2019-07-20T02:46:51.977 回答
1

您可以定义一个执行 cd 然后获取文件的函数。此函数将尝试在新目录中获取 .source_me(如果存在):

mycd () {
builtin cd $@
[ $? -eq 0 -a -f .source_me ] && source .source_me
}

启用使用该功能

alias cd=mycd
于 2013-06-11T19:22:11.427 回答