Question zsh: définit automatiquement les variables d'environnement pour un répertoire


Disons que j'ai un projet dans:

~/working_dir

Chaque fois que je lance des commandes à partir de ce répertoire, je dois avoir certaines variables d'environnement définies. Je peux donc les exporter ainsi:

export VAR=value

Cependant, il y en a beaucoup et cela devient fastidieux. De plus, j'oublie parfois et lance une commande pour la faire échouer car il manque les variables d'environnement qui lui donnent des clés API ou quelque chose.

Existe-t-il un moyen pour que zsh se souvienne de ces variables d'environnement pour ce répertoire, de sorte que chaque fois que je lance une commande à partir de ce répertoire, elle s'exécute avec ces variables d'environnement définies?


4
2017-12-19 18:59


origine




Réponses:


Il est possible de faire cela - voici un screencast, en utilisant le Grml ZSH configuration.

Informations complémentaires:

Edit: C'est en fait assez facile à faire. Voici la partie pertinente de votre ~/.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 )

Activez le profil pour chaque répertoire souhaité:

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

Et n'oubliez pas de créer un profil:

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

    export VAR=value
}

Edit # 2: Ce serait en fait plutôt agréable de coupler avec répertoires nommés [Stackoverflow.net].


6
2018-01-06 03:29



Il n'y a rien de "facile" à propos de cette solution. - raine
@rane a accepté! Cela me semble complexe. - Bklyn


Vous pouvez utiliser https://github.com/horosgrisa/autoenv pour y parvenir. j'utilise antigène actif que comme ça:

antigen bundle horosgrisa/autoenv

Ensuite, quand vous entrez dans un répertoire avec un .env fichier dedans, il sera source et vous pouvez y ranger les variables.


2
2018-03-26 23:19





Même si c'est une vieille question, je voudrais ajouter cette solution facile de 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
2018-04-22 08:00



Cela fonctionne très bien, mais vous pouvez probablement sauter les lignes 5-6 si vous chargez déjà .zshrc lorsque zsh est initialisé. - jstr
@jstr Il est de réinitialiser quel que soit le $PWD/.zsh_config fait. - aars


Pas par répertoire, non, mais s'ils sont identiques, vous pouvez les placer dans vos fichiers de démarrage (.bash_profile pour bash, pas sûr de savoir ce que c'est pour zsh). Sinon, je suggère de mettre tous les paramètres dans un fichier dans ce répertoire et de le rechercher avant d'exécuter des commandes. Pas une solution idéale, mais je pense que c'est proche du meilleur que vous pourrez trouver.


0
2017-12-19 19:08





Vous pouvez créer un script qui configure l’env et vous changez vers ce répertoire .. alors utilisez-le au lieu de cd working_dir


0
2017-12-19 19:12