Когда я использую ZSH, как мне установить PATH в /etc/profile.d?

17

Я использую zsh в качестве моей оболочки, и я пытаюсь настроить свою среду.

Обычно я определяю свою переменную $JAVA_HOME , создавая файл:

/etc/profile.d/java.sh

со следующим содержанием

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

затем я выхожу из системы и обратно, и все работает, но по какой-то причине переменная PATH не установлена. Он распознает JAVA_HOME , но не новый PATH , см. Этот фрагмент терминала:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

, и я подтвердил это, пытаясь запустить командную форму jvm

~  java -version
zsh: command not found: java

PATH не содержит $JAVA_HOME , как следует. есть что-то еще, что я должен проверить?

Я проверил, что если я запустил:

source /etc/profile.d/java.sh

все работает правильно, и мои переменные устанавливаются так, как должны, но не должны ли скрипты из /etc/profile.d запускаться автоматически?

    
задан Rodrigo Sasaki 03.06.2014 в 15:39
источник

4 ответа

17

С моей точки зрения, лучший способ - добавить следующие строки в файле ~/.zshrc (если у вас его еще нет, а затем создать его):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

Затем перезагрузите zsh или просто запустите source ~/.zshrc , а затем ваш PATH должен быть точно таким, каким вы хотите.

Или, если вы хотите сделать изменение общесистемным, добавьте предыдущий код в конец файла /etc/zsh/zshenv .

Но в любом случае не используйте /etc/profile.d для автоматического запуска скриптов в zsh . Этот каталог полезен только для оболочки bash , а не zsh , как в вашем случае. Чтобы понять это, откройте файл /etc/profile , который представляет собой bash файл инициализации и ни в коем случае не zsh файл инициализации , и вы увидите где-нибудь на конец файла:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Итак, ваши скрипты из каталога /etc/profile.d будут автоматически запускаться в zsh , только если вы добавите предыдущий код в файл инициализации zsh, например, например /etc/zsh/zprofile или источник /etc/profile в файле /etc/zsh/zprofile .     

ответ дан Radu Rădeanu 03.06.2014 в 23:12
источник
2

Я нахожу, что размещение всего в одном файле .zshenv быстро становится трудным для управления. Я рекомендую установить oh-my-sh , а затем поместить различные настройки (env vars, functions) в .oh-my-sh/custom/ в качестве отдельных файлов .zsh .

Я также обнаружил, что этот подход работает безупречно, когда ssh'ing в машину при изменении переменных env, таких как PATH . Также он отлично работает вместе с vcsh для сохранения настроек и синхронизации.

    
ответ дан dvim 26.06.2015 в 17:22
1

Так как JAVA_HOME установлено, вы подтвердили, что эти сценарии получены автоматически, не так ли?

Единственное логическое объяснение заключается в том, что PATH устанавливается позже каким-то образом. Он должен быть первоначально задан PAM, который читает /etc/environment , и насколько я знаю, что происходит до того, как будут получены файлы /etc/profile.d/*.sh . Возможно, zsh работает по-разному по сравнению с bash в этом отношении.

    
ответ дан Gunnar Hjalmarsson 03.06.2014 в 22:54
0

Просто запутался в этой проблеме локально после запуска обновлений. Похоже, проблема с корнем - Drush не знает, где найти законную копию php, которая включает pdo. К счастью, он поддерживает этот путь в переменной окружения, поэтому я сделал это в командной строке:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

Это исправило проблему, поэтому я редактировал .zshrc и добавил, что в файл проблема решена.

    
ответ дан Allen Freeman 23.04.2015 в 18:50