Sistema operacional : Ubuntu 16.04.3
Shell : Bash 4.3.48
Eu 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 , eu 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 ao meu entendimento é o seguinte:
$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)
Tanto quanto eu sei (e seguindo a lógica dos exemplos anteriores), ele deve imprimir bar
, não (bar baz)
.
Isso só acontece comigo? Esse é o comportamento pretendido e estou perdendo alguma coisa? Ou isso é um bug?
export var=(foo bar); echo "${var[0]}"
, imprimafoo
, não(foo bar)
.export
lo mostra:declare -ax var=([0]="foo" [1]="bar")
export i_am_array=(foo bar); /usr/bin/env | grep i_am_array
não dá saída aqui.foo() { declare -p var; } ; var=(bar baz) foo
dádeclare -x var="(bar baz)"
confirmando que está sendo tratado como uma string, não uma matrizRespostas:
Geralmente chamando:
onde
cmd
é uma função não é portátil.Com
bash
, que funciona apenas para variáveis escalares (e comx=(...)
analisado como uma matriz, mas atribuído como escalar) e há vários problemas com o escopo, se você fizer isso, comksh93
eyash
, ele funciona, mas a definição de variável permanece posteriormente. Commksh
, você recebe 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 sendo executados) varia de shell para shell (está no bash, yash, mksh, zsh, mas não no ksh, cinza).
Só funciona da maneira que você esperaria
zsh
. Observe que oszsh
índices da matriz começam em 1.fonte
Não é apenas um bug, parece ser um recurso não implementado, sem planos de ser. Esta postagem na lista de discussão de 2014 tem isso do criador:
A partir do mais recente repositório git para Bash, temos isso em
variables.c
:Sugerindo que o que quer que esteja lá não está completo.
fonte
execve()
chamada de sistema envolvida. Vejazsh
um shell que suporte funções de chamada com uma matriz temporariamente configurada dessa maneira.my_var=one func_bar
:). Podemos dizer que issoexport
está contribuindo para o meio ambiente e, portanto, a exportação é usada aqui, sob o capô? Olhe para a minha resposta, eu adicionei o código de demonstração.Na
man bash
seção BUGS do (a versão dobash
é 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.fonte