web-dev-qa-db-fra.com

Puis-je exporter une variable vers l'environnement à partir d'un script bash sans la rechercher?

supposons que j'ai ce script

export.bash:

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

lorsque j'exécute le script et tente d'accéder au $VAR je ne reçois aucune valeur!

echo $VAR

Existe-t-il un moyen d'accéder au $VAR simplement en exécutant export.bash sans le rechercher?

233
tarrsalah

Existe-t-il un moyen d'accéder au $VAR en exécutant simplement export.bash sans le rechercher?

Réponse rapide: Non.

Mais il existe plusieurs solutions de contournement 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

Une autre façon consiste à avoir le script, plutôt que de définir une variable d'environnement, des commandes d'impression qui définiront la variable d'environnement:

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

Une troisième approche consiste à avoir un script qui définit vos variables d’environnement en interne et appelle ensuite une commande spécifiée avec cet 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 que cela 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).

264
Keith Thompson

Pour exporter la variable VAR en premier, la méthode la plus logique et semble fonctionner consiste à la source de la variable:

. ./export.bash

ou

source ./export.bash

Maintenant, quand cela résonne depuis le shell principal, cela fonctionne

 echo $VAR
HELLO, VARABLE

Nous allons maintenant réinitialiser VAR

export VAR=""
echo $VAR

Maintenant, nous allons exécuter un script pour trouver la variable, puis la désélectionner:

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

le code: chat 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 un moyen

VEUILLEZ NOTER: les exportations sont limitées au script qui les exécute dans votre console principale. Pour l'ajout d'un travail cron, je l'ajouterais comme la console, comme ci-dessous ... pour la partie commande encore discutable: voici comment rentrez de votre shell:

Sur votre invite de commande (tant que le fichier 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 usage - vous pouvez rendre 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 $1}'); unset $variable;
done

}

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

Quoi qu'il en soit, retour au reste de celui-ci ..

Cela a rendu disponible globalement puis exécuté le script ..

faites simplement écho puis lancez export sur l'écho!

chat export.bash

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

Maintenant, dans le script ou votre console exécutée:

 export "$(./export.bash)"

Essayer:

echo $VAR
HELLO THERE

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

chat export.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 $1}');
     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 dernière mise à jour finale pour affecter 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 $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
48
Vahid

Nous avons trouvé un moyen intéressant et pratique 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
12
Van

Execute

set -o allexport

Toutes les variables que vous sourcez à partir d'un fichier seront exportées dans votre shell.

source conf-file

Quand tu as fini d'exécuter. Cela désactivera le mode allexport.

set +o allexport
6
mdornfe1

Une autre solution de contournement qui, selon les 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 qui répondra à tous ces inconvénients.

export.bash:

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

Maintenant:

./export.bash
echo $VAR
3
Gonmator

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

le script: myExport

#! \bin\bash
export $1

un alias dans mon .bashrc

alias myExport='source myExport' 

Vous le trouvez toujours, mais peut-être que de cette façon, il est plus utilisable et intéressant pour quelqu'un d'autre.

1
Malcomar

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 }

En raison de l'utilisation variable à l'extérieur, vous pouvez éviter d'écrire un fichier de script.

1
zhi.yang