Exportando a variável de ambiente

1

Desejo exportar uma variável de ambiente cujo valor contenha uma variável, mas não quero que essa variável (que está dentro do valor) seja avaliada durante o processo de exportação. ou seja,

export STY=for i in {0..3}; do echo $i; done

então, minha exigência é que, quando eu fizer eco a STY, a saída que eu preciso seja

echo $STY
for i in {0..3}; do echo $i; done 

Mas $ i é avaliado durante a exportação. Eu preciso preservar como é.

    
por Shahzad 25.02.2012 / 02:40

4 respostas

2

Se você quiser o que disse você queria:

export STY="for i in {0..3}; do echo \$i; done"

Se você quer o que você provavelmente quis dizer:

function STY() {
    for i in {0..3}; do echo $i; done
}
export -f STY
    
por 25.02.2012 / 02:42
2

Curto: use eval "$ hello".

(Esta resposta originalmente dizia: use eval $ ola mas outro pôster apontou que eval "$ hello" é mais seguro.

Como mostrado abaixo:

bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'

Simplesmente dizer $ hello no início de uma linha não funciona - porque os loops são processados antes da expansão $ variable (linguagens orientadas para fase, eu os odeio):

bash-2.05a$ $hello
bash: for: command not found

Mas a avaliação funciona:

bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$ 

O que você estava (ou poderia ter feito) errado:

bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$ 

Ou seja. pelo menos na versão do bash que estou usando, {0..4} não faz o que você achou que deveria.

O

link diz que o recurso {0..4} veio no bash 3.0 +.

Talvez você, como eu (no woprk, não em casa), esteja usando uma versão obsoleta do bash?

    
por 25.02.2012 / 04:16
1

O motivo pelo qual $hello não é executado como esperado:

  • A expansão é executada na linha de comando depois de ter sido dividida em tokens.
  • for...do...done é um Compound Command que é determinado no estágio de tokenlize.
  • for não é um comando.

Então, você não pode fazer isso:

$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token 'do'

Quando o bash divide a linha de comando em tokens, ele vê "for" não for , então token do é inesperado.

No seu caso:

$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found

O Bash encontra um token $hello e, em seguida, variable-expansion & & word-spliting em ordem.
Na verdade, o bash analisa o resultado como Simple Command :

    O comando
  • ( for ) recebe o descanso como args ( i , in , {0..4} , ; , do , ...)
  • for , do , ; , done , etc perderam seus significados especiais.

leia mais para detalhes

    
por 25.02.2012 / 04:22
0

O problema tem dois lados:

  • armazenando expressões complexas na variável
  • executando a expressão armazenada

Para armazenar expressões, seqüências de escape e citações especiais podem ser necessárias (o que parece estar correto em seu exemplo). A execução pode ser executada de duas maneiras:

  • chamada de função como na resposta da Borealid: data = 'STY ()' - saída padrão da função é armazenada na variável
  • avaliação de expressão: data = eval $STY para a definição de variável fornecida no seu exemplo
por 25.02.2012 / 04:05