![zsh:自动为目录设置环境变量](https://linux22.com/image/1343475/zsh%EF%BC%9A%E8%87%AA%E5%8A%A8%E4%B8%BA%E7%9B%AE%E5%BD%95%E8%AE%BE%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png)
假设我有一个项目:
~/working_dir
每当我从此目录运行命令时,我都需要设置某些环境变量。因此我可以像这样导出它们:
export VAR=value
然而,这些命令太多了,而且很繁琐,另外我有时会忘记,运行命令却失败了,因为它缺少给它 API 密钥或其他东西的环境变量。
有没有办法让 zsh 记住这个目录的这些环境变量,以便任何时候我从该目录运行任何命令时,它都会按照设置的环境变量运行?
答案1
与为此设计的其他工具相比,direnv
是其中最好的。
direnv
是 shell 的环境切换器。它知道如何挂载 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录。这允许项目特定环境变量而不会使~/.profile
文件混乱。
direnv
与其他类似工具的区别在于:
direnv
用 Go 编写,快点与用 Python 编写的版本相比direnv
支持卸下退出特定目录时的环境变量direnv
覆盖许多外壳
类似项目
答案2
这是可以做到的——这里有一个截屏直播, 使用格鲁姆中山大学配置。
更多信息:
- Mikas 博客文章
- 函数
chpwd_profiles()
Grml ZSH 配置。
编辑:这实际上很容易做到。以下是您的相关部分~/.zshrc
:
function chpwd_profiles() {
local profile context
local -i reexecute
context=":chpwd:profiles:$PWD"
zstyle -s "$context" profile profile || profile='default'
zstyle -T "$context" re-execute && reexecute=1 || reexecute=0
if (( ${+parameters[CHPWD_PROFILE]} == 0 )); then
typeset -g CHPWD_PROFILE
local CHPWD_PROFILES_INIT=1
(( ${+functions[chpwd_profiles_init]} )) && chpwd_profiles_init
elif [[ $profile != $CHPWD_PROFILE ]]; then
(( ${+functions[chpwd_leave_profile_$CHPWD_PROFILE]} )) \
&& chpwd_leave_profile_${CHPWD_PROFILE}
fi
if (( reexecute )) || [[ $profile != $CHPWD_PROFILE ]]; then
(( ${+functions[chpwd_profile_$profile]} )) && chpwd_profile_${profile}
fi
CHPWD_PROFILE="${profile}"
return 0
}
# Add the chpwd_profiles() function to the list called by chpwd()!
chpwd_functions=( ${chpwd_functions} chpwd_profiles )
激活您想要的每个目录的配置文件:
zstyle ':chpwd:profiles:/path/to/directory(|/|/*)' profile NAME
并且不要忘记创建个人资料:
chpwd_profile_NAME() {
[[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
print "chpwd(): Switching to profile: $profile"
export VAR=value
}
编辑 #2:这实际上会相当巧妙地与命名目录[Stackoverflow.net]。
答案3
尽管这是一个老问题,但我想添加这个简单的解决方案https://coderwall.com/p/a3xreg/per-directory-zsh-config
// Add this to your ~/.zshrc
function chpwd() {
if [ -r $PWD/.zsh_config ]; then
source $PWD/.zsh_config
else
source $HOME/.zshrc
fi
}
答案4
add-zsh-hook
通过调用事件可以很容易地做到这一点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。