Quelle est la différence entre $ path et $ PATH (minuscule versus majuscule) avec zsh?

13

Dans FreeBSD 12, en utilisant le zshshell, j'ai remarqué cette différence en regardant $path(en minuscules) par rapport à $PATH(en majuscules).

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

Une sortie est délimitée par le caractère ESPACE, l'autre par le caractère COLON.

➥ Pourquoi la différence?

Ces deux variables sont-elles différentes et distinctes? Ou est-ce que les minuscules / majuscules déclenchent une sorte d'astuce ou de sens que je ne connais pas?

Est-ce une zshfonctionnalité? Ou une fonctionnalité de FreeBSD?

Basil Bourque
la source
1
Mis à part: dans tout shell compatible POSIX, les noms de variables avec des caractères en minuscules sont garantis sans danger pour l'utilisation de l'application (pour ne pas modifier silencieusement le comportement du shell ou du système lorsqu'ils sont modifiés). C'est l'un des endroits où la décision de zsh de ne suivre que la norme où cela a du sens pour eux peut créer des maux de tête aux auteurs de scripts, car les garanties standard ne s'appliquent pas.
Charles Duffy
@CharlesDuffy avez-vous un lien vers la partie de la norme où elle dit tout cela sur les variables minuscules et majuscules? Merci.
mosvy
@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - lisez-le en gardant à l'esprit que les variables shell et d'environnement partagent un seul espace de noms (la définition d'une variable shell met à jour la valeur de toute variable d'environnement de même nom existante; la définition d'une variable d'environnement initialise les variables shell). Les lignes spécifiques: L'espace de noms des noms de variables d'environnement contenant des lettres minuscules est réservé aux applications. Les applications peuvent définir toutes les variables d'environnement portant des noms à partir de cet espace de noms sans modifier le comportement des utilitaires standard.
Charles Duffy
@CharlesDuffy Cela ne s'applique pas ici. Réglage de l' pathintérieur zshne mettre à jour pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy
@mosvy, vous m'avez convaincu que cela ne viole pas la lettre de la norme. L' esprit , d'autre part, rendrait le for path in "$dir"/*code réflexif sûr à écrire.
Charles Duffy

Réponses:

20

C'est une caractéristique zshhéritée de csh/ tcsh.

La variable $path tableau est liée à la variable $PATH scalaire (chaîne). Toute modification de l'un se reflète dans l'autre.

Dans zsh(contrairement à (t)csh), vous pouvez lier d'autres variables à côté $PATHde typeset -T. Il est classique, mais pas obligatoire, d'utiliser un nom en majuscule pour le scalaire séparé par deux-points et le même nom en minuscule pour le tableau. Alors que deux-points est le séparateur par défaut, d'autres séparateurs peuvent être utilisés (par exemple, une nouvelle ligne pour lier une chaîne multiligne à un tableau ou une virgule pour lier une ligne csv à un tableau)

Dans les versions récentes de zsh, typeset -p PATHou typeset -p pathmontre le lien entre les deux variables:

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

C'est utile dans la mesure où il est plus facile d'ajouter des composants de suppression ou de les boucler.

Faire un typeset -U pathpour rendre les éléments uniques permet également de garder la $PATHvariable propre (quelque chose de similaire peut être réalisé tcshavec set -f).

Stéphane Chazelas
la source