Коли я використовую 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, function) в .oh-my-sh/custom/каталог у вигляді окремих .zshфайлів.

Я також виявив, що такий підхід працює бездоганно, коли сш'інг в машину під час модифікації змінних env, таких як PATH. Крім того, це працює дуже добре разом з vcsh для збереження резервних копій та синхронізації.


Використовуючи oh my zsh Framework, куди б ви помістили змінну з 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використовувати його так само, як і головну відповідь ?
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.