Possível erro no Bash ?: foo () {echo “$ {var [0]}”; }; var = (bar baz) foo

22

SO : 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 do 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 da minha compreensão é isso:

$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)

Tanto quanto eu sei (e seguindo a lógica dos exemplos anteriores), deve imprimir bar , não (bar baz) .

Isso só acontece comigo? Esse é o comportamento pretendido e estou perdendo alguma coisa? Ou isso é um bug?

    
por nxnev 21.12.2017 / 19:03

3 respostas

19

Geralmente chamando:

var=value cmd

onde cmd é uma função não é portátil.

Com bash , isso só funciona para variáveis escalares (e com x=(...) analisado como uma matriz, mas atribuído como um escalar) e há vários problemas com o escopo se você fizer isso, com ksh93 e yash , funciona, mas a definição da variável permanece depois. Com mksh , você recebe um erro de sintaxe. No shell Bourne, não funcionou nem 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 (isto é, passada para os comandos sendo executados) varia de shell para shell (é em bash, yash , mksh, zsh, mas não em ksh, ash).

Funciona da maneira esperada com zsh . Observe que os índices de matriz zsh começam em 1.

bash-4.4$ zsh
$ a=(before value)
$ f() echo $a[1]
$ a=(temp value) f
temp
$ echo $a[1]
before
    
por 21.12.2017 / 21:01
12

Não é apenas um bug, parece ser um recurso não implementado, sem planos de ser assim. Este post da lista de discussão de 2014 tem isso do criador:

Fortunately, in bash 4.3 (patchlevel 25), you cannot just -DARRAY_EXPORT and get array variable import/export. The code doesn't compile, and if you fix that, it does not link, and if you fix that, well, you end up with the following issue.

     

Isso é uma tonelada de problemas para passar apenas por isso. Eu não tenho nenhum   planeja ativar a exportação de matriz.

O pull do repositório mais recente do git para o Bash tem isso em variables.c :

  #  if ARRAY_EXPORT
        /* Array variables may not yet be exported. */

Sugerindo que o que quer que esteja lá não está completo.

    
por 21.12.2017 / 20:46
10

Da seção BUGS do man bash (a versão do bash é 4.3):

BUGS

   Array variables may not (yet) be exported.

O próximo código demonstra que uma variável temporária existe no ambiente, somente enquanto a função está sendo executada. Quando a função estiver concluída, a variável temporária desaparece.

### defining the "bar" function
### it pass all environment variables to the "grep" command
### and the "grep" prints the only "my_var" variable from it
bar() { env | grep my_var=; }

### calls the "bar" function with the temporary 
### variable "my_var" created and assigned.
my_var=one bar

my_var=one         ### The output. The environment contains the "my_var" variable

### checks, does the environment still have the "my_var" variable
### (It doesn't have.)
env | grep my_var=
                   ### The output is empty,
                   ### the environment doesn't contain the "my_var" variable

Informações relacionadas:

por 21.12.2017 / 20:17

Tags