Questão zsh: define automaticamente variáveis ​​de ambiente para um diretório


Digamos que eu tenha um projeto em:

~/working_dir

Sempre que executo comandos desse diretório, preciso definir determinadas variáveis ​​de ambiente. Então eu posso exportá-los assim:

export VAR=value

No entanto, existem muitos deles e isso é entediante, além disso, às vezes esqueço e executo um comando apenas para que ele falhe porque está faltando as variáveis ​​de ambiente que fornecem chaves de API ou algo assim.

Existe uma maneira que eu possa obter zsh para lembrar essas variáveis ​​de ambiente para este diretório, para que a qualquer momento eu executar qualquer comando a partir desse diretório é executado com essas variáveis ​​de ambiente definidas?


4


origem




Respostas:


É possível fazer isso - aqui está uma screencast, usando o Grml ZSH configuração.

Outras informações:

Edit: Isso é realmente muito fácil de fazer. Aqui está a parte relevante do seu ~/.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 )

Ative o perfil para cada diretório desejado:

zstyle ':chpwd:profiles:/path/to/directory(|/|/*)' profile NAME

E não esqueça de criar um perfil:

chpwd_profile_NAME() {
    [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
    print "chpwd(): Switching to profile: $profile"

    export VAR=value
}

Edit # 2: Isso seria realmente muito bom para se juntar com diretórios nomeados [Stackoverflow.net].


6



Não há nada "fácil" sobre essa solução. - raine
@rane concordou! Parece muito complexo para mim. - Bklyn


Você pode usar https://github.com/horosgrisa/autoenv para conseguir isso. eu uso antígeno para ativa que assim:

antigen bundle horosgrisa/autoenv

Então, quando você entra em um diretório com um .env arquivo nele, ele será originado e você pode ser as variáveis ​​lá.


2





Embora essa seja uma pergunta antiga, gostaria de adicionar essa solução fácil 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
}

2



Isso funciona muito bem, mas você provavelmente pode pular as linhas 5-6 se já estiver carregando .zshrc quando zsh é inicializado. - jstr
@jstr É para redefinir o que quer que seja $PWD/.zsh_config fez. - aars


Não por diretório, não, mas se forem iguais você pode colocá-los em seus arquivos de inicialização (.bash_profile para bash, não sei o que é para zsh). Caso contrário, sugiro apenas colocar todas as configurações em um arquivo nesse diretório e fazer o sourcing antes de executar os comandos. Não é uma solução ideal, mas acho que está perto do melhor que você conseguirá encontrar.


0





Você pode criar um script que configura o env e muda você para esse diretório. Então, use-o em vez de cd working_dir


0