W FreeBSD 12, używając zsh
powł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 zsh
funkcja? Lub funkcja FreeBSD?
path
wewnątrzzsh
nie będzie zaktualizować dowolnąpath
envvar:path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
.for path in "$dir"/*
odruchowo bezpieczny kod do pisania.Odpowiedzi:
Jest to funkcja
zsh
odziedziczona zcsh
/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$PATH
ztypeset -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 PATH
albotypeset -p path
pokazuje związek między dwiema zmiennymi:Jest to przydatne, ponieważ ułatwia dodawanie składników do usuwania lub zapętlanie ich.
Wykonanie a,
typeset -U path
aby elementy były unikalne, pomaga również utrzymać$PATH
zmienną w czystości (coś podobnego można osiągnąć zatcsh
pomocąset -f
).źródło