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

22

Я использую в 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запускаться автоматически?

Родриго Сасаки
источник
Вы пробовали редактировать ~/.profileи размещать там переменные? Может быть, PATHэто перезаписывается в другом месте в /etc/profile.d/.
saiarcot895

Ответы:

27

С моей точки зрения, лучший способ - добавить следующие строки в ~/.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файл.

Раду Рэдяну
источник
4
Возможно, ~/.zprofileможет быть лучше, чем ~/.zshrc.
Муру
3

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

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

dvim
источник
Используя oh my framework zsh, куда бы вы поместили переменную с IP-адресом (удаленный сервер), чтобы использовать ее для доступа SSH? Мне нужен ip для git и скрипт входа на сервер.
Тимо
1
Гектометр Не совсем уверен, что вы имеете в виду. Я бы поставил конфиг как ip-адреса и имена пользователей для ssh to~/.ssh/config
dvim
Лично я предпочитаю этот подход принятому ответу, так как мне нравится преимущество использования vcsh, а «настраиваемая» папка для ZSH - идеальное место для подобных вещей.
Эрик Браун
1

Поскольку JAVA_HOMEон установлен, вы подтвердили, что эти сценарии создаются автоматически, не так ли?

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

Гуннар Хьялмарссон
источник
0

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

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

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

Аллен Фриман
источник
1
Итак, вы предлагаете .zshrcиспользовать его так же, как верхний ответ ?
Муру