desenv-web-rp.com

Posso exportar uma variável para o ambiente a partir de um script bash sem precisar obtê-la?

suponha que eu tenha esse script

export.bash:

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

quando executo o script, e tento acessar o $VAR não recebo nenhum valor!

echo $VAR

Existe alguma maneira de acessar o $VAR apenas executando export.bash sem ter que fazer isso?

224
tarrsalah

Existe alguma maneira de acessar o $VAR apenas executando export.bash sem ter que fazer isso?

Resposta rápida: não.

Mas há várias soluções possíveis.

O mais óbvio, que você já mencionou, é usar source ou . para executar o script no contexto do Shell de chamada:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

Outra maneira é ter o script, em vez de definir uma variável de ambiente, imprimir comandos que definirão a variável de ambiente:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

Uma terceira abordagem é ter um script que define sua (s) variável (s) de ambiente internamente e, em seguida, invoca um comando especificado com esse ambiente:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "[email protected]"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

Essa última abordagem pode ser bastante útil, embora seja inconveniente para uso interativo, pois não fornece as configurações do seu Shell atual (com todas as outras configurações e histórico que você criou).

251
Keith Thompson

Para exportar a variável VAR primeiro, a maneira mais lógica e que parece funcionar é a fonte da variável:

. ./export.bash

ou

source ./export.bash

Agora, quando ecoando da Shell principal, funciona

 echo $VAR
HELLO, VARABLE

Vamos agora redefinir VAR

export VAR=""
echo $VAR

Agora vamos executar um script para buscar a variável e depois desmarcá-la:

./test-export.sh 
HELLO, VARABLE
--
.

o código: cat test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

Aqui está um jeito

ATENÇÃO: As exportações são limitadas ao script que executa as exportações em seu console principal - assim, na medida em que um cron job eu gostaria de adicioná-lo como o console como abaixo ... para a parte de comando ainda questionável: aqui está como você faria executar a partir do seu shell:

Em seu prompt de comando (desde que o export.bash tenha vários valores de eco)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

gato v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

Agora, desde que isso seja para o seu uso - você poderia tornar as variáveis ​​disponíveis para seus scripts a qualquer momento, fazendo um alias bash como este:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

adicione isto ao seu .bashrc

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "[email protected]"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

fonte seu arquivo bashrc e você pode fazer como acima a qualquer momento ...

De qualquer forma de volta para o resto do mesmo ..

Isso tornou disponível globalmente, em seguida, executou o script ..

simplesmente faça eco e execute a exportação no eco!

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"

Agora, dentro do script ou do seu console, execute:

 export "$(./export.bash)"

Experimentar:

echo $VAR
HELLO THERE

Vários valores, desde que você saiba o que espera em outro script usando o método acima:

cat export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

cat test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

Agora os resultados

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

e a última atualização final para atribuição automática lê as VARIABLES:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

O script: cat test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1
43
Vahid

Encontrou uma maneira interessante e organizada de exportar variáveis ​​de ambiente de um arquivo:

em env.vars:

foo=test

script de teste:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test
12
Van

Execute

set -o allexport

Quaisquer variáveis ​​que você obter de um arquivo depois disso serão exportadas no seu Shell.

source conf-file

Quando terminar, execute. Isso desativará o modo allexport.

set +o allexport
6
mdornfe1

Outra solução que, dependendo do caso, pode ser útil: criar outro bash que herda a variável exportada. É um caso particular de resposta @Keith Thompson, será todos esses inconvenientes.

export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

Agora:

./export.bash
echo $VAR
3
Gonmator

A resposta é não, mas para mim eu fiz o seguinte

o script: myExport

#! \bin\bash
export $1

um alias no meu .bashrc

alias myExport='source myExport' 

Ainda assim, você pode obtê-lo, mas talvez assim seja mais útil e interessante para outra pessoa.

1
Malcomar

Talvez você possa escrever uma função em ~/.zshrc, ~/.bashrc.

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

Beacause de usar variável fora, você pode evitar escrever arquivo de script.

1
zhi.yang