Puis-je exporter une variable de l'environnement à partir d'un script bash sans sourcing?

supposons que j'ai ce script

à l'exportation.bash :

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

quand j'exécute le script, et que j'essaie d'accéder au $VAR Je n'obtiens aucune valeur !

echo $VAR

est-il possible d'accéder au $VAR en exécutant simplement exportation.bash sans sourcing it ?

178
demandé sur codeforester 2013-05-18 01:18:02

7 réponses

y a-t-il un moyen d'accéder au $VAR en exécutant simplement export.bash sans s'en procurer ?

réponse rapide: non.

mais il existe plusieurs solutions de rechange possibles.

le plus évident, que vous avez déjà mentionné, est d'utiliser source ou . pour exécuter le script dans le contexte du shell appelant:

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

un autre la manière est d'avoir le script, plutôt que de définir une variable d'environnement, imprimez des commandes qui définiront la variable d'environnement:

$ cat set-vars2.sh
#!/bin/bash

echo export FOO=BAR
$ eval $(./set-vars2.sh)
$ echo $FOO
BAR

notez que le $(...) joindra la sortie en une seule ligne. Si vous avez plus d'une chose à régler, vous devriez ajouter des points-virgule aux commandes imprimées pour qu'elles soient toujours valides après avoir été jointes.

une troisième approche consiste à avoir un script qui définit votre(vos) variable (s) d'environnement en interne. puis invoque une commande spécifiée avec l'environnement:

$ cat set-vars3.sh
#!/bin/bash

export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

cette dernière approche peut être très utile, bien qu'elle ne soit pas pratique pour une utilisation interactive car elle ne vous donne pas les paramètres de votre shell actuel (avec tous les autres paramètres et l'historique que vous avez construits).

217
répondu Keith Thompson 2013-05-17 23:36:24

pour exporter la variable VAR d'abord la manière la plus logique et semble efficace est de trouver la variable:

. ./export.bash

ou

source ./export.bash

maintenant quand l'écho de shell principal il fonctionne

 echo $VAR
HELLO, VARABLE

nous allons maintenant réinitialiser VAR

export VAR=""
echo $VAR

maintenant, nous allons exécuter un script pour source la variable puis la désactiver:

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

le code: 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

Voici une façon de

s'il vous PLAÎT NOTE: Les exportations sont limitées pour le script qui exécutent les exportations dans votre console principale - pour autant une tâche cron, je voudrais ajouter il aime la console comme ci-dessous... pour la partie commande encore discutable: voici comment vous exécuteriez à partir de votre shell:

sur votre invite de commande (aussi longtemps que l'export.bash a plusieurs valeurs d'écho)

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

chat v1.sh

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

Maintenant, tant que c'est pour votre utilisation, vous pouvez faire les variables disponibles pour vos scripts à tout moment, en faisant un alias bash comme ceci:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

ajoutez ceci à votre .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 }'); unset $variable;
done

}

source votre fichier bashrc et vous pouvez faire comme ci-dessus à tout moment ...

de toute façon, revenons au reste..

cela a fait disponible globalement puis exécuté le script..

il suffit de echo, puis exécuter l'exportation sur l'écho !

chat à l'exportation.bash

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

Maintenant dans un script ou votre console:

 export "$(./export.bash)"

, Essayez:

echo $VAR
HELLO THERE

valeurs multiples tant que vous savez ce que vous attendez dans un autre script en utilisant la méthode ci-dessus:

chat à l'exportation.bash

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

chat 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 }');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

maintenant les résultats

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


.

et la mise à jour finale pour assigner automatiquement lire les 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

le script: chat 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 }');
 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 }');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1
37
répondu Vahid 2013-05-17 23:21:11

a trouvé une façon intéressante et soignée d'exporter des variables d'environnement à partir d'un fichier:

dans env.vars :

foo=test

script de test:

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
11
répondu Van 2015-12-27 08:32:31

un autre contournement qui, dépend du cas, pourrait être utile: créer un autre bash qui hérite de la variable exportée. C'est un cas particulier de @Keith Thompson répondre à tous ces inconvénients.

à l'exportation.bash:

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

Maintenant:

./export.bash
echo $VAR
2
répondu Gonmator 2015-12-08 14:44:39

Exécuter

set -o allexport

toutes les variables que vous trouvez dans un fichier après cela seront exportées dans votre shell.

source conf-file

quand vous avez fini, exécutez. Cela désactivera le mode allexport.

set +o allexport
2
répondu mdornfe1 2018-06-04 04:39:29

Peut-être que vous pouvez écrire une fonction dans ~/.zshrc,~/.bashrc .

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }
"151910920 à Cause de l'utilisation de la variable à l'extérieur, vous pouvez éviter d'écrire le fichier de script.

1
répondu zhi.yang 2016-05-21 14:32:21

la réponse est non, mais pour moi j'ai fait ce qui suit

le script: myExport

#! \bin\bash
export 

un alias dans mon .bashrc

alias myExport='source myExport' 

Encore vous source, mais peut-être que de cette façon il est plus utilisable, et c'est intéressant pour quelqu'un d'autre.

0
répondu Malcomar 2015-01-09 10:04:41