AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 412330
Accepted
nxnev
nxnev
Asked: 2017-12-22 10:03:27 +0800 CST2017-12-22 10:03:27 +0800 CST 2017-12-22 10:03:27 +0800 CST

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

  • 772

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 varo 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?

bash array
  • 3 3 respostas
  • 2834 Views

3 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-22T12:01:19+08:002017-12-22T12:01:19+08:00

    Geralmente chamando:

    var=value cmd
    

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

    Com bash, isso funciona apenas para variáveis ​​escalares (e com x=(...)parsed como uma matriz, mas atribuída como escalar) e há vários problemas com o escopo se você fizer isso, com ksh93e yash, funciona, mas a definição da variável permanece depois. Com mksh, 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 que zshos índices da matriz começam em 1.

    bash-4.4$ zsh
    $ a=(before value)
    $ f() echo $a[1]
    $ a=(temp value) f
    temp
    $ echo $a[1]
    before
    
    • 19
  2. user267036
    2017-12-22T11:46:01+08:002017-12-22T11:46:01+08:00

    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:

    Felizmente, no bash 4.3 (patchlevel 25), você não pode apenas -DARRAY_EXPORT e obter a importação/exportação da variável array. O código não compila e, se você corrigir isso, ele não será vinculado e, se você corrigir isso, acabará com o seguinte problema.

    Isso é uma tonelada de problemas para passar apenas por isso. Não tenho planos de habilitar a exportação de array.

    Puxar do repositório git mais recente para 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.

    • 12
  3. MiniMax
    2017-12-22T11:17:06+08:002017-12-22T11:17:06+08:00

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

    INSETOS

       Array variables may not (yet) be exported.
    

    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.

    ### 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ção relacionada:

    • Responda sobre a VAR=VALUE some-commandconstrução.
    • Exportando uma matriz no script bash
    • bash: definir a variável env da matriz e desreferenciá-la de qualquer script de shell falha
    • 10

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve