我一直在从事几个项目,它们需要不同的环境变量(例如,PATH
对于不同版本的clang
可执行文件,PYTHONPATH
对于几个外部模块)。每当我从事一个项目时,我都必须自己修改这些环境变量(例如,更改.zshrc
/.bashrc
和source
it);我有时会忘记并犯错误。
有没有一种方法/项目可以帮助自动执行此操作,类似于虚拟环境在 Python 中呢?
答案1
有成熟的工具旨在为特定目录设置环境变量。
与为此设计的其他工具相比,direnv
是其中最好的。主要好处之一是它支持卸下当您退出该目录时,更改环境变量。
direnv
是 shell 的环境切换器。它知道如何挂钩 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录。这允许项目特定环境变量而不会使~/.profile
文件混乱。
direnv
与其他类似工具的区别是什么:
direnv
是用 Go 编写的,快点与用 Python 编写的对应版本相比direnv
支持卸下当您从特定目录退出时使用环境变量direnv
覆盖许多贝壳
类似项目
- 环境模块- 最古老(以一种好的方式)的环境加载系统之一
- 自动环境- 轻的;不支持卸载;用Python写的很慢
- zsh-autoenv- autoenv 和的功能丰富的混合物智能CD:进入/离开事件、嵌套、隐藏(仅限 Zsh)。
- ~~阿斯达夫~~,asdf是一个插件管理器,用于切换同一可执行文件的不同版本。根本不是环境切换器。
答案2
add-zsh-hook
对于 zsh,通过调用事件很容易做到这一点chpwd
。
env_on_chdir () {
case $PWD in
/home/user/path/to/dir )
export GO111MODULE=on;
;;
/home/user/other/dir )
export NO_COLOR=true;
;;
* )
# change background, when entering any other directory
export GO111MODULE=off;
unset NO_COLOR;
;;
esac
}
# add env_on_chdir to chpwd_functions
add-zsh-hook chpwd env_on_chdir
有关更多信息,请参阅https://www.refining-linux.org/archives/42-ZSH-Gem-8-Hook-function-chpwd.html。
答案3
是的,太多的维护和太多的个人物品。
我建议将大部分精力投入到具有适合平台的适当范围的名称上,这样您就可以一直拥有所有这些名称。 PYTHONPATH 是一个很好的例子...您不太可能希望将其重新用于 Ruby 项目...您可以使用注释对组进行分组和标记以.bashrc
方便维护。
并不总是可以做到这一点,即。当存在冲突时(加上它需要编辑而不是使用离散文件),有时您需要一个特定于框架的安装文件。一种方法是设置别名来运行它们,例如
例如
alias pp='. ~/pp.setup' # For using Python
alias rb='. /rb.setup' # For using Ruby
您还可以创建一个函数,类似于“切换器”,它使用/设置一个变量,并仅使用传入的参数进行切换,或者仅切换到非当前内容。
答案4
您可以使用迪伦夫在目录更改时加载环境变量。从其主页:
direnv 是 shell 的环境切换器。它知道如何挂钩 bash、zsh、tcsh、fish shell 和 elvish 以根据当前目录加载或卸载环境变量。这允许使用特定于项目的环境变量,而不会弄乱 ~/.profile 文件。
我将它与 shell 一起使用xonsh
(通过一个小的附加插件),效果非常好。