zsh config - eksportować czy nie eksportować?

23

Podczas ustawiania zmiennych w moim ~/.zshrcmogę albo użyćexport

export PATH=/some/path

albo nie

PATH=/some/path

Czym się różnią i których powinienem użyć?

jordelver
źródło
Zmienne środowiskowe, które są również używane przez nieinteraktywne powłoki (powiedzmy napisany przez ciebie skrypt powłoki) powinny się znaleźć .zshenv.
Francisco
Czy są również ~/.zshenvpozyskiwane z powłok logowania? Należy PATHtam zdefiniować?
jordelver
1
PATHjest prawdopodobnie najlepszym przykładem zmiennej, którą należy zdefiniować wewnątrz ~/.zshenv, ten plik jest pobierany przez dowolną sesję zsh (chyba że użyjesz jakiejś opcji, aby ją wyłączyć). Sprawdź, man zshktóre pliki są pobierane i w jakiej kolejności.
Francisco
Ok, dzięki @Francisco Przeczytam stronę podręcznika man.
jordelver

Odpowiedzi:

21

Jeśli chcesz, aby programy działały z zsh, aby zobaczyć var, wyeksportuj go.
W przypadku ścieżki prawdopodobnie chcesz wyeksportować.
Zamiast tego export PATH=/some/pathprawdopodobnie chcesz export PATH="$PATH:/some/path", chyba że zamierzasz całkowicie wyczyścić wstępnie ustawioną ścieżkę systemu.

poważny
źródło
To jest świetne, dziękuję. Teraz użyję eksportu jako ogólnej zasady.
jordelver
21

Demure już odpowiedział na twoje konkretne pytanie. Jest to jednak zshpytanie PATH. Oto kolejny punkt: oprócz zmiennej standardowej $PATHistnieje także $pathtablica. Tutaj widzisz różnicę (dwukropki czy nie ...):

$ print $PATH
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
$print $path
/bin /usr/bin /usr/local/bin /usr/X11R6/bin

Oba warianty są automatycznie synchronizowane. Jaka jest więc korzyść z używania tablicy?

  • Tę ostatnią można zadeklarować za pomocą, typeset -U pathaby „zachować tylko pierwsze wystąpienie każdej zduplikowanej wartości” (z man zshbuiltins). Oznacza to, że utrzymuje twoją ścieżkę w czystości, nawet jeśli sukcesywnie pozyskujesz ją ~/.zshrc(ponieważ ją zmieniłeś lub cokolwiek innego) i nie zaśmiecasz jej wciąż tymi samymi wartościami.
  • Możesz użyć, path+=(/new/path)aby dodać nowy katalog do ŚCIEŻKI. Aby usunąć element, musisz użyć niektórych sztuczek, patrz np. Https://stackoverflow.com/q/3435355/2037712 lub http://www.zsh.org/mla/users//2005/msg01132.html
  • Za pomocą można łatwo zapętlić elementy w ścieżce for i ($path) { print $i # or do something else }

Na koniec fragment mojej konfiguracji:

typeset -U path
path=(/new/path1
      /new/path2
      $path)
export PATH
mpy
źródło
Dziękuję, to było kolejne pytanie. Spojrzę na zarządzanie moją ścieżką za pomocą pathzamiast PATH.
jordelver
1
Cieszę się, że już się obawiałem, że jestem OT. Btw. kolejna zaleta, o której zapomniałem: możesz łatwo zapętlić elementy for i ($path) { print $i # or do something else }.
mpy