Situação. Eu trabalho no Cygwin e há uma variável de ambiente do Windows que aponta para uma das pastas especiais:
ProgramFiles(x86)=C:\Program Files (x86)
Como você vê, o nome da variável contém parênteses. Tentativas ingênuas de ler o valor parecem não funcionar:
echo "${ProgramFiles(x86)}" # bad substitution
echo "${ProgramFiles\(x86\)}" # bad substitution
Tentei encontrar regras gerais sobre como escapar caracteres em nomes de variáveis, mas não consegui.
Pergunta. É possível usar uma variável cujo nome inclui parênteses ou outros símbolos incomuns?
PS No meu caso específico obtive o mesmo valor com cygpath -F 42
.
Geralmente, sim. POSIX permite qualquer coisa como variável de ambiente que pode ser representada como string. (E a coisa que há uma chave e um valor, isso é apenas comportamento codificado de
getenv
esetenv
: Nachar* environ[]
lista, há apenas strings, e algumas podem ter um=
nelas, separando chave e valor.)Então, sim, isso funciona. Você pode tentar no seu shell python (basta executar
python3
):Se algum shell gosta disso: tópico diferente! Na verdade, o zsh vai filtrar isso diretamente, e o bash também. (As variáveis de ambiente não são listadas, e nem recebem seus conteúdos, quando executadas
set
a partir desses shells.)Então, se você quiser acessá-los, precisará fazer um desvio por meio de um programa auxiliar.
deve funcionar.
Você pode obter seu valor com o
printenv
comando:Ou copie-o para uma variável de shell com um nome mais conveniente:
Isso é feio, mas deve funcionar:
Bem. POSIXly, um nome de variável no shell não pode conter parênteses ou coisas do tipo, porque então não seria um nome . Há uma definição explícita para esse termo:
Isso não quer dizer que strings no ambiente não possam conter outros caracteres, e de fato o Bash usa
%
sinais nas envvars que ele cria para funções exportadas. Mas qualquer coisa assim não será e não pode ser importada para ser visível como variáveis de shell. Escapar caracteres especiais simplesmente não entra em questão neste caso.