4

Допустим, у меня есть проект в:

~/working_dir

Всякий раз, когда я запускаю команды из этого каталога, мне нужно установить определенные переменные среды. Так что я могу экспортировать их так:

export VAR=value

Однако их много, и это становится утомительным, плюс я иногда забываю и запускаю команду только для того, чтобы она потерпела неудачу, потому что отсутствуют переменные среды, которые дают ей ключи API или что-то в этом роде.

Есть ли способ заставить zsh запомнить эти переменные среды для этого каталога, чтобы каждый раз, когда я запускаю какую-либо команду из этого каталога, она запускалась с установленными переменными среды?

5 ответов5

6

Это можно сделать - вот скринкаст с использованием конфигурации 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].

2

Вы можете использовать https://github.com/horosgrisa/autoenv для достижения этой цели. Я использую антиген, чтобы активировать это так:

antigen bundle horosgrisa/autoenv

Затем, когда вы войдете в каталог с файлом .env , он будет получен, и вы сможете обслуживать переменные там.

2

Несмотря на то, что это старый вопрос, я хотел бы добавить это простое решение по адресу 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
}
0

Нет, для каждого каталога нет, но если они одинаковые, вы можете поместить их в свои файлы запуска (.bash_profile для bash, не уверен, что это для zsh). В противном случае, я бы предложил просто поместить все настройки в файл в этом каталоге и получить его перед запуском команд. Не идеальное решение, но я думаю, что оно близко к лучшему, которое вы сможете найти.

0

Вы можете создать скрипт, который устанавливает env и меняет вас на этот каталог .. затем используйте его вместо cd working_dir

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .