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 eu executo o script, e tento acessar o $VAR eu não recebo nenhum valor!

 echo $VAR 

Existe alguma maneira de acessar o $VAR apenas executando o export.bash sem obtê- lo?

    Existe alguma maneira de acessar o $VAR apenas executando o export.bash sem export.bash lo?

    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 irão definir a variável de ambiente:

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

    Observe que o $(...) unirá a saída em uma única linha. Se você tiver mais de uma coisa para definir, adicione pontos-e-vírgulas aos comandos impressos para que eles ainda sejam válidos depois de serem unidos.

    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 "$@" $ ./set-vars3.sh printenv | grep FOO FOO=BAR 

    Essa última abordagem pode ser bastante útil, embora seja inconveniente para uso interativo, já que ela não fornece as configurações em seu shell atual (com todas as outras configurações e histórico que você construiu).

    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 do shell principal, funciona

      echo $VAR HELLO, VARABLE 

    Vamos agora redefinir VAR

     export VAR="" echo $VAR 

    Agora vamos executar um script para a fonte da variável e, em seguida, desmarcá-lo:

     ./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 é um caminho

    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 adicionaria como o console como abaixo … para a parte de comando ainda questionável: aqui está como você faria executar a partir do seu shell:

    No 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 variables ​​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; "$@"; 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.

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

    Simplesmente echo-lo, em seguida, executar 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 

    Encontrou uma maneira interessante e organizada de exportar variables ​​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 

    Outra solução alternativa 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 

    Executar

     set -o allexport 

    Quaisquer variables ​​que você originar 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 

    Talvez você possa escrever uma function 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.

    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.