Jaka jest różnica między $ path i $ PATH (małe i duże litery) w Zsh?

13

W FreeBSD 12, używając zshpowłoki, zauważyłem tę różnicę, patrząc na $path(małe litery) w porównaniu z $PATH(wielkie litery).

echo $path

/ sbin / bin / usr / sbin / usr / bin / usr / local / sbin / usr / local / bin / usr / home / freebsd / bin

echo $PATH

/ sbin: / bin: / usr / sbin: / usr / bin: / usr / local / sbin: / usr / local / bin: / usr / home / freebsd / bin

Jedno wyjście jest rozdzielone znakiem SPACJA, a drugie znakiem KOLON.

➥ Skąd ta różnica?

Czy te dwie różne, odrębne zmienne? A może małe / wielkie litery wywołują jakiś trick lub znaczenie, o którym nie wiem?

Czy to jest zshfunkcja? Lub funkcja FreeBSD?

Basil Bourque
źródło
1
Poza tym: w każdej powłoce zgodnej z POSIX, nazwy zmiennych z dowolnymi małymi znakami są bezpieczne dla aplikacji (nie po cichu modyfikują zachowania powłoki lub systemu po zmianie). Jest to jedno z miejsc, w których decyzja zsh, by postępować zgodnie ze standardem tylko tam, gdzie ma to sens, może przysporzyć kłopotów autorom skryptów, ponieważ standardowe gwarancje nie mają zastosowania.
Charles Duffy
@CharlesDuffy czy masz link do tej części standardu, w której jest napisane coś o zmiennych małych i wielkich liter? Dzięki.
mosvy 28.07.19
@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - przeczytaj, pamiętając, że zmienne powłoki i środowiska współużytkują jedną przestrzeń nazw (ustawienie zmiennej powłoki aktualizuje wartość dowolnej istniejącej zmiennej środowiskowej o podobnej nazwie; ustawienie zmiennej środowiskowej inicjuje zmienne powłoki). Poszczególne wiersze: Przestrzeń nazw nazw zmiennych środowiskowych zawierających małe litery jest zarezerwowana dla aplikacji. Aplikacje mogą definiować dowolne zmienne środowiskowe o nazwach z tej przestrzeni nazw bez modyfikowania zachowania standardowych narzędzi.
Charles Duffy
@CharlesDuffy To nie dotyczy tutaj. Ustawienie pathwewnątrz zshnie będzie zaktualizować dowolną pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy 28.07.19
@mosvy, przekonałeś mnie, że nie narusza to litery standardu. Z drugiej strony duch stworzyłby for path in "$dir"/*odruchowo bezpieczny kod do pisania.
Charles Duffy

Odpowiedzi:

20

Jest to funkcja zshodziedziczona z csh/ tcsh.

$path Macierz zmiennych jest związana do $PATH skalarnej zmiennej (strun). Wszelkie modyfikacje w jednym są odzwierciedlone w drugim.

W zsh(w przeciwieństwie do (t)csh) możesz powiązać inne zmienne $PATHz typeset -T. Konwencjonalne, ale nie obowiązkowe jest używanie wielkiej litery dla skalara oddzielonego dwukropkami i tej samej nazwy małymi literami dla tablicy. Podczas gdy dwukropek jest domyślnym separatorem, można użyć innych separatorów (na przykład newline, aby powiązać ciąg wieloliniowy z tablicą lub przecinek, aby powiązać wiersz csv z tablicą)

W ostatnich wersjach zsh, typeset -p PATHalbo typeset -p pathpokazuje związek między dwiema zmiennymi:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

Jest to przydatne, ponieważ ułatwia dodawanie składników do usuwania lub zapętlanie ich.

Wykonanie a, typeset -U pathaby elementy były unikalne, pomaga również utrzymać $PATHzmienną w czystości (coś podobnego można osiągnąć za tcshpomocą set -f).

Stéphane Chazelas
źródło