Kiedy używam ZSH, jak ustawić PATH w /etc/profile.d?

22

Używam zshjako mojej powłoki i próbuję skonfigurować środowisko.

Zwykle definiuję swoją $JAVA_HOMEzmienną, tworząc plik:

/etc/profile.d/java.sh

o następującej treści

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

potem wylogowuję się i loguję ponownie i wszystko działa, ale z jakiegoś powodu PATHzmienna nie jest ustawiona. Rozpoznaje JAVA_HOME, ale nie nowy PATH, zobacz ten fragment terminalu:

~  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

i potwierdziłem to, próbując uruchomić polecenie z JVM

~  java -version
zsh: command not found: java

PATHnie obejmuje $JAVA_HOME, jak powinien. czy jest coś jeszcze, co powinienem sprawdzić?

Sprawdziłem, że jeśli uruchomię:

source /etc/profile.d/java.sh

wszystko działa poprawnie, a moje zmienne ustawiają się tak, jak powinny, ale czy skrypty nie powinny być /etc/profile.duruchamiane automatycznie?

Rodrigo Sasaki
źródło
Czy ~/.profilezamiast tego próbowałeś edytować i umieszczać tam zmienne? Być może PATHjest to nadpisywane gdzie indziej /etc/profile.d/.
saiarcot895

Odpowiedzi:

27

Z mojego punktu widzenia najlepszym sposobem jest dodanie do ~/.zshrcpliku następujących linii (jeśli jeszcze go nie masz, to utwórz go):

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

Następnie uruchom ponownie zshlub po prostu uruchom, source ~/.zshrca następnie ŚCIEŻKA powinna być dokładnie taka, jak chcesz.

Lub, jeśli chcesz, aby zmiana obejmowała cały system, dodaj poprzedni kod na końcu /etc/zsh/zshenvpliku.

Ale w żadnym wypadku nie używaj /etc/profile.ddo automatycznego uruchamiania skryptów zsh. Ten katalog jest przydatny tylko dla bashpowłoki, a nie zshjak w twoim przypadku. Aby to zrozumieć, otwórz /etc/profileplik, który jest plikiem inicjującym bash , aw żadnym wypadku nie jest zsh plikiem inicjującym , a zobaczysz gdzieś na końcu pliku:

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

Tak, skrypty z /etc/profile.dkatalogu będą automatycznie uruchamiane w zshtylko jeśli dodać do poprzedniego kodu w pliku inicjującym zsh, jak /etc/zsh/zprofilena przykład, czy źródło /etc/profilew /etc/zsh/zprofilepliku.

Radu Rădeanu
źródło
4
Być może ~/.zprofilemoże być lepszy niż ~/.zshrc.
muru
3

Uważam, że umieszczanie wszystkiego w jednym .zshenvpliku szybko staje się trudne do zarządzania. Zalecam zainstalowanie oh-my-sh, a następnie umieszczenie różnych dostosowań (zmiennych env, funkcji) w .oh-my-sh/custom/katalogu jako osobnych .zshplików.

Odkryłem również, że to podejście działa bezbłędnie, gdy ssh'ing do maszyny podczas modyfikowania zmiennych env, takich jak PATH. Działa też bardzo ładnie w połączeniu z vcsh do tworzenia kopii zapasowych i synchronizacji dostosowań.

dvim
źródło
Używając oh mojego środowiska zsh, gdzie umieściłbyś zmienną z adresem IP (zdalny serwer), aby używać jej do dostępu ssh? Potrzebuję ip do git i skryptu logowania na serwer.
Timo,
1
Hm Nie jestem pewien, co masz na myśli. Umieściłbym konfigurację, taką jak adresy IP i nazwy użytkowników dla ssh do~/.ssh/config
dvim
Osobiście wolę to podejście od zaakceptowanej odpowiedzi, ponieważ podoba mi się korzyść z używania vcsh, a folder „niestandardowy” dla ZSH jest idealnym miejscem na takie rzeczy.
Erick Brown
1

Od JAVA_HOME jest ustawiony, potwierdziłeś, że te skrypty są pozyskiwane automatycznie, prawda?

Jedynym logicznym wyjaśnieniem jest to, że PATHjest ustalone później. Powinien być pierwotnie ustawiony przez PAM, który czyta /etc/environmenti, o ile wiem, dzieje się to przed /etc/profile.d/*.shpozyskaniem plików. Być może zsh działa pod tym względem inaczej niż bash.

Gunnar Hjalmarsson
źródło
0

Właśnie napotkałem ten problem lokalnie po uruchomieniu aktualizacji. Wygląda na to, że głównym problemem jest to, że Drush nie wie, gdzie znaleźć legalną kopię php zawierającą pdo. Na szczęście obsługuje ukrywanie tej ścieżki w zmiennej środowiskowej, więc zrobiłem to w wierszu poleceń:

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

To rozwiązało problem, więc edytowałem .zshrc i dodałem go do pliku, problem rozwiązany.

Allen Freeman
źródło
1
Sugerujesz więc, aby .zshrcużyć tej samej odpowiedzi, co najlepsza odpowiedź ?
muru,