Qual é a diferença entre $ path e $ PATH (minúsculas versus maiúsculas) com zsh?

12

No FreeBSD 12, usando o zshshell, notei essa diferença ao olhar para $path(minúsculas) versus $PATH(maiú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

Uma saída é delimitada pelo caractere ESPAÇO, a outra pelo caractere COLON.

➥ Por que a diferença?

Essas duas variáveis ​​são diferentes e separadas? Ou as letras minúsculas / maiúsculas acionam algum tipo de truque ou significado que eu não conheço?

Isso é um zshrecurso? Ou um recurso do FreeBSD?

Basil Bourque
fonte
1
Além disso: em qualquer shell compatível com POSIX, os nomes de variáveis ​​com caracteres minúsculos são garantidos como seguros para o uso do aplicativo (para não modificar silenciosamente o comportamento do shell ou do sistema quando alterado). Este é um dos lugares em que a decisão do zsh de seguir apenas o padrão em que faz sentido para eles pode causar dores de cabeça para os autores do script, porque as garantias padronizadas não se aplicam.
Charles Duffy
@CharlesDuffy você tem um link para a parte do padrão em que diz algo sobre as variáveis ​​em maiúsculas e minúsculas? Obrigado.
mosvy
@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - leia-o tendo em mente que variáveis ​​de ambiente e shell compartilham um único espaço de nome (definir a variável a shell atualiza o valor de qualquer variável de ambiente com nome semelhante; definir uma variável de ambiente inicializa variáveis ​​de shell). As linhas específicas: O espaço de nomes dos nomes de variáveis ​​de ambiente que contêm letras minúsculas é reservado para aplicativos. Os aplicativos podem definir qualquer variável de ambiente com nomes desse espaço de nomes sem modificar o comportamento dos utilitários padrão.
Charles Duffy
@CharlesDuffy Isso não se aplica aqui. Definir pathdentro zshnão vai atualizar qualquer pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'.
mosvy
@mosvy, você me convenceu de que isso não viola a letra da norma. O espírito , por outro lado, criaria for path in "$dir"/*um código reflexivamente seguro para escrever.
Charles Duffy

Respostas:

19

Essa é uma característica zshherdada de csh/ tcsh.

A variável de $path matriz está vinculada à variável $PATH escalar (string). Qualquer modificação em um é refletida no outro.

Em zsh(ao contrário (t)csh), você pode amarrar outras variáveis junto $PATHcom typeset -T. É convencional, mas não obrigatório, usar um nome em maiúsculas para o escalar separado por dois pontos e o mesmo nome em minúsculas para a matriz. Enquanto dois pontos é o separador padrão, outros separadores podem ser usados ​​(por exemplo, nova linha para amarrar uma sequência de linhas múltiplas a uma matriz ou vírgula para amarrar uma linha csv a uma matriz)

Nas versões recentes de zsh, typeset -p PATHou typeset -p pathmostra o link entre as duas variáveis:

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

Isso é útil, pois facilita adicionar componentes de remoção ou fazer um loop sobre eles.

Fazer um typeset -U pathpara tornar os elementos únicos também ajuda a manter a $PATHvariável limpa (algo semelhante pode ser alcançado tcshcom set -f).

Stéphane Chazelas
fonte