Qual è la differenza tra $ path e $ PATH (lettere minuscole contro lettere maiuscole) con zsh?


13

In FreeBSD 12, usando la zshshell, ho notato questa differenza quando guardavo $path(minuscolo) contro $PATH(maiuscolo).

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

Un output è delimitato dal carattere SPACE, l'altro dal carattere COLON.

➥ Perché la differenza?

Queste sono due variabili diverse e separate? Oppure la lettera minuscola / maiuscola attiva qualche tipo di trucco o significato che non conosco?

Questa è una zshcaratteristica? O una caratteristica di FreeBSD?


1
A parte: in qualsiasi shell conforme a POSIX, i nomi delle variabili con caratteri minuscoli sono garantiti in modo sicuro per l'uso dell'applicazione (non modificare silenziosamente il comportamento della shell o del sistema quando viene modificato). Questo è uno dei luoghi in cui la decisione di zsh di seguire solo lo standard in cui ha senso per loro può creare mal di testa per gli autori di script, perché le garanzie standardizzate non si applicano.
Charles Duffy,

@CharlesDuffy hai un link alla parte dello standard in cui si dice qualcosa delle variabili minuscole e maiuscole? Grazie.
mosvy,

@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - leggilo tenendo presente che le variabili di shell e ambiente condividono un singolo spazio dei nomi (l'impostazione di una variabile di shell aggiorna il valore di qualsiasi variabile di ambiente con nome simile esistente; l'impostazione di una variabile di ambiente inizializza le variabili di shell). Le righe specifiche: lo spazio dei nomi di variabili di ambiente che contiene lettere minuscole è riservato alle applicazioni. Le applicazioni possono definire qualsiasi variabile d'ambiente con nomi da questo spazio dei nomi senza modificare il comportamento delle utility standard.
Charles Duffy,

@CharlesDuffy Questo non si applica qui. Impostazione pathdentro zshnon aggiornerà alcun pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy,

@mosvy, mi hai convinto che non viola la lettera dello standard. Lo spirito , d'altra parte, renderebbe il for path in "$dir"/*codice riflessivo sicuro da scrivere.
Charles Duffy,

Risposte:


20

Questa è una caratteristica zshereditata da csh/ tcsh.

La variabile $path array è legata alla variabile $PATH scalare (stringa). Qualsiasi modifica su uno si riflette nell'altro.

In zsh(contrariamente a (t)csh), puoi legare altre variabili oltre $PATHa typeset -T. È convenzionale, ma non obbligatorio, utilizzare un nome maiuscolo per lo scalare separato da due punti e lo stesso nome in minuscolo per l'array. Mentre i due punti sono il separatore predefinito, è possibile utilizzare altri separatori (ad esempio newline per legare una stringa multilinea a un array o virgola per legare una riga CSV a un array)

Nelle versioni recenti di zsh, typeset -p PATHo typeset -p pathmostra il collegamento tra le due variabili:

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

È utile in quanto semplifica l'aggiunta di componenti di rimozione o il loro ciclo.

Fare un typeset -U pathper rendere unici gli elementi aiuta anche a mantenere $PATHpulita la variabile (si può ottenere qualcosa di simile tcshcon set -f).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.