Em zsh, é uma variável de matriz especial, cujo conteúdo está vinculado à variável path
conhecida .PATH
Tão especial, de fato, que definir e chamar a função
f() { local -r path=42 }
causa o erro f: read-only variable: path
. Se a variável local for declarada como mutável (ou seja, sem -r
), tudo funcionará conforme o esperado. Não consegui reproduzir esse erro com outros nomes de variáveis.
Por que esse erro ocorre e é intencional? Existem regras semelhantes para outros nomes?
Estou usando o zsh 5.2 (x86_64-apple-darwin16.0) no macOS 10.12.6.
TL;DR não reutilize "parâmetros internos especiais" como
path
porque uh eles são especiais. Ou de acordo com a lista de discussão , pode-se usar o-h
sinalizador:(No entanto, mudar
path
para um número inteiro pode atrapalhar o código subsequente que esquece essa substituição e assume quepath
épath
...)Mais escavação segue (mas eu perdi totalmente a
-h
coisa de esconder ...)Esta é uma propriedade (recurso? bug?) de variáveis especiais, mas não de variáveis semelhantes vinculadas pelo usuário:
Existem vários outros parâmetros que exibem esse comportamento:
Portanto, algumas variáveis são como no Animal Farm mais especiais do que outras. Esta mensagem de erro vem de vários lugares em
Src/params.c
que se isso for modificado para imprimir qual mensagem é a mensagem específica quezsh
encontramos ao compilar:É o código bastante genérico
Isso mostra que o problema acontece em outro lugar; as variáveis não especiais sem dúvida não foram
PM_READONLY
definidas, enquanto as variáveis especiais que falharam, sim. O próximo lugar óbvio para procurar é o códigolocal
que atende por uma variedade de nomes (typeset
export
...). Estes são todos builtins, então podem ser encontrados à espreita nas profundezas doSrc/builtin.c
Todas essas chamadas
bin_typeset
com vários sinalizadores definidos, então vamos estudar a fonte dessa função... xingamentos nos comentários, confira. Observa que as coisas estão complicadas, confira. Nada realmente salta à vista, embora a toca do coelho (para quando a opção "tratar argumentos como padrões" não-m
estiver definida, que é o caso aqui) pareça levar à função ...typeset_single
Existe algum código
POSIXBUILTINS
relacionado areadonly
, mas está desativado em meus shells de testeentão vou ignorar esse código (espero. Isso poderia ser um covil de shoggoth e não uma mera toca de coelho?). Enquanto isso! Alguns pontos de depuração para o
PM_READONLY
sinalizador sendo ativadopath
pela seguinte linhaQue por sua vez vem da
on
variável que por sua vez já está ativada quando atypeset_single
função é inserida, suspiro, entãobin_typeset
vamos lá... ok, basicamente tem umTYPESET_OPTSTR
que de alguma forma via algumas macros habilitaPM_READONLY
por padrão; quando, em vez disso, uma variável fornecida pelo usuário é executada por esse caminho de código, elaPM_READONLY
é desativada e tudo está bem.Se isso pode ser alterado para que variáveis especiais, como
path
sejam feitas somente leitura, é uma questão para um desenvolvedor ZSH (tente a lista de discussão zsh-workers?) Caso contrário, enquanto isso, não mexa com as variáveis especiais.