zsh:自动为目录设置环境变量

zsh:自动为目录设置环境变量

假设我有一个项目:

~/working_dir

每当我从此目录运行命令时,我都需要设置某些环境变量。因此我可以像这样导出它们:

export VAR=value

然而,这些命令太多了,而且很繁琐,另外我有时会忘记,运行命令却失败了,因为它缺少给它 API 密钥或其他东西的环境变量。

有没有办法让 zsh 记住这个目录的这些环境变量,以便任何时候我从该目录运行任何命令时,它都会按照设置的环境变量运行?

答案1

与为此设计的其他工具相比,direnv是其中最好的。

direnv是 shell 的环境切换器。它知道如何挂载 bash、zsh、tcsh、fish shell 和 elvish 来加载或卸下环境变量取决于当前目录。这允许项目特定环境变量而不会使~/.profile文件混乱。

direnv与其他类似工具的区别在于:

  • direnv用 Go 编写,快点与用 Python 编写的版本相比
  • direnv支持卸下退出特定目录时的环境变量
  • direnv覆盖许多外壳

类似项目

  • 环境模块- 最古老的(好的方面)环境加载系统之一
  • 自动环境- 轻量级;不支持卸载;用 Python 编写速度慢
  • zsh-自动环境- autoenv 和功能丰富的混合体智能光盘:进入/离开事件、嵌套、存储(仅限 Zsh)。
  • 安省- 具有插件系统的纯 bash 解决方案

答案2

这是可以做到的——这里有一个截屏直播, 使用格鲁姆中山大学配置

更多信息:

编辑:这实际上很容易做到。以下是您的相关部分~/.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

相关内容