SO : Ubuntu 16.04.3
Shell : Bash 4.3.48
Sei que é possível alterar temporariamente o conteúdo de uma variável como em var=value command
, sendo provavelmente IFS= read -r var
o caso mais notável disso.
E, graças ao wiki de Greg , também entendo:
# Why this
foo() { echo "$var"; }
var=value foo
# And this does work
var=value; echo "$var"
# But this doesn't
var=value echo "$var"
O que escapa à minha compreensão é isto:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Tanto quanto sei (e seguindo a lógica dos exemplos anteriores), deve imprimir bar
, não (bar baz)
.
Isso só acontece comigo? Este é o comportamento pretendido e está faltando alguma coisa? Ou isso é um bug?
Geralmente chamando:
onde
cmd
é uma função não é portátil.Com
bash
, isso funciona apenas para variáveis escalares (e comx=(...)
parsed como uma matriz, mas atribuída como escalar) e há vários problemas com o escopo se você fizer isso, comksh93
eyash
, funciona, mas a definição da variável permanece depois. Commksh
, você obtém um erro de sintaxe. No shell Bourne, não funcionou, mesmo para variáveis escalares.Observe também que mesmo com variáveis escalares, se a variável acaba sendo exportada dentro da função (ou seja, passada para comandos que estão sendo executados) varia de shell para shell (está em bash, yash, mksh, zsh, mas não em ksh, cinza).
Funciona apenas da maneira que você esperaria com
zsh
. Observe quezsh
os índices da matriz começam em 1.Não é apenas um bug, parece ser um recurso não implementado e sem planos de sê-lo. Esta postagem da lista de discussão de 2014 tem isso do criador:
Puxar do repositório git mais recente para Bash tem isso em
variables.c
:Sugerindo que o que quer que esteja lá não está completo.
Da
man bash
seção BUGS (a versãobash
é 4.3):O próximo código demonstra que existe uma variável temporária no ambiente, apenas enquanto a função está em execução. Quando a função é concluída, a variável temporária desaparece.
Informação relacionada:
VAR=VALUE some-command
construção.