¿Cuál es la diferencia entre $ path y $ PATH (minúsculas versus mayúsculas) con zsh?

13

En FreeBSD 12, usando el zshshell, noté esta diferencia al mirar $path(minúsculas) versus $PATH(mayúsculas).

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

Una salida está delimitada por el carácter ESPACIO, la otra por el carácter COLON.

➥ ¿Por qué la diferencia?

¿Son estas dos variables diferentes y separadas? ¿O las minúsculas / mayúsculas desencadenan algún tipo de truco o significado que no conozco?

¿Es esta una zshcaracterística? ¿O una característica de FreeBSD?

Albahaca Bourque
fuente
1
Aparte: en cualquier shell compatible con POSIX, los nombres de las variables con caracteres en minúscula están garantizados para el uso de la aplicación (no para modificar silenciosamente el comportamiento del shell o del sistema cuando se cambia). Este es uno de los lugares donde la decisión de zsh de seguir solo el estándar donde tiene sentido para ellos puede causar dolores de cabeza para los autores de guiones, porque las garantías estandarizadas no se aplican.
Charles Duffy
@CharlesDuffy, ¿tiene un enlace a la parte del estándar donde dice algo sobre las variables en mayúsculas y minúsculas? Gracias.
mosvy
@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - léalo teniendo en cuenta que las variables de entorno y shell comparten un solo espacio de nombres (la configuración de una variable de shell actualiza el valor de cualquier variable de entorno con nombre similar existente; establecer una variable de entorno inicializa las variables de shell Las líneas específicas: el espacio de nombres de nombres de variables de entorno que contienen letras minúsculas está reservado para las aplicaciones. Las aplicaciones pueden definir cualquier variable de entorno con nombres de este espacio de nombres sin modificar el comportamiento de las utilidades estándar.
Charles Duffy
@CharlesDuffy Eso no se aplica aquí. Ajuste pathel interior zshno se actualizará cualquier pathvarentorno: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy
@mosvy, me has convencido de que no viola la letra de la norma. El espíritu , por otro lado, haría for path in "$dir"/*un código reflexivamente seguro para escribir.
Charles Duffy

Respuestas:

20

Esa es una característica de zshheredado de csh/ tcsh.

La variable de $path matriz está vinculada a la variable $PATH escalar (cadena). Cualquier modificación en uno se refleja en el otro.

En zsh(contrario a (t)csh), puede vincular otras variables además de $PATHcon typeset -T. Es convencional, pero no obligatorio, usar un nombre en mayúscula para el escalar separado por dos puntos y el mismo nombre en minúscula para la matriz. Si bien los dos puntos son el separador predeterminado, se pueden usar otros separadores (por ejemplo, nueva línea para vincular una cadena de varias líneas a una matriz o una coma para vincular una fila csv a una matriz)

En versiones recientes de zsh, typeset -p PATHo typeset -p pathmuestra el enlace entre las dos variables:

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

Eso es útil porque hace que sea más fácil agregar componentes de eliminación o recorrerlos.

Hacer un typeset -U pathpara que los elementos sean únicos también ayuda a mantener $PATHlimpia la variable (se puede lograr algo similar tcshcon set -f).

Stéphane Chazelas
fuente