Salva a saída do comando como variáveis de ambiente [duplicado]

0

Se o comando my_command tiver esta saída:

VAR1=some_value
VAR2=other_value

é possível chamar my_command de um script de shell para que ambos VAR1 e VAR2 sejam salvos como variáveis de ambiente?

Eu tentei as seguintes formas e nenhuma delas funciona:

#!/bin/bash
source my_command
export 'my_command'

No entanto, se eu inserir manualmente

export 'my_command'

em um console de terminal, as duas variáveis são salvas.

    
por Jivan 03.01.2018 / 18:10

2 respostas

3

Se você tem my_command assim:

#!/bin/sh
echo 'VAR1=some_value'
echo 'VAR2=other_value'

executá-lo obviamente imprime

VAR1=some_value
VAR2=other_value

Agora, source my_command irá executar o script, no shell atual, que produzirá as atribuições como saída. Você usaria source se my_command não imprimisse as atribuições, mas fosse executado diretamente.

export $(my_command) irá pegar a saída do script, e passá-lo para exportar, o que colocará as variáveis no ambiente atual do shell, mas ele só funcionará enquanto as variáveis em questão don não contém espaços em branco ou caracteres glob, pois a substituição do comando não é citada. Colocar "$(my_command)" entre aspas realmente não ajuda, porque, em seguida, exportVAR1=some_value\nVAR2=other_value como um argumento e apenas VAR1 está definido.

Note que executar export $(my_command) ou definir variáveis de qualquer outra forma dentro de outro script não irá definir aquelas variáveis no shell pai. Se você quiser as atribuições no seu shell interativo, você deve executá-las lá, mas você pode envolver as atribuições em uma função ou source um script que faz as atribuições.

Uma solução óbvia seria fazer o que o ssh-agent faz e ter os comandos export de saída do script para as variáveis que ele define. Então seria o suficiente para executar eval "$(my_command)" .

Se não quisermos fazer isso, podemos usar set -a antes do script para que o shell exporte automaticamente quaisquer variáveis que estejam configuradas.

Então,

$ set -a
$ eval "$(my_command)"

No Bash, podemos usar declare -p para verificar se as variáveis são exportadas ( -x ):

$ declare -p VAR1 VAR2
declare -x VAR1="some_value"
declare -x VAR2="other_value"

Usar eval aqui permitirá que o script produza strings citadas como VAR1="foo bar" e elas serão tratadas corretamente. eval também executará qualquer outra coisa do script my_command de saídas, não apenas atribuições, mas se você não confiar em my_command , não deverá executá-lo.

    
por 03.01.2018 / 18:57
0

Você não pode definir variáveis do shell pai em um script de shell que você chamar a partir dele. Qualquer um

  • defina as variáveis como de costume no script, mas use como fonte: . my_command
  • faça com que o script imprima as variáveis a serem definidas como stdout e eval uate o resultado

    $ cat foo.sh 
    #!/bin/sh
    echo FOO=foo
    echo BAR=bar
    $ ./foo.sh 
    FOO=foo
    BAR=bar
    $ eval $(./foo.sh)
    $ echo $FOO
    foo
    $ echo $BAR
    bar
    
por 03.01.2018 / 18:58