411 votes

Puis-je exporter une variable vers l'environnement à partir d'un script Bash sans le sourcer ?

Supposons que j'ai ce script :

export.bash :

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

Lorsque j'exécute le script et que j'essaie d'accéder à l'application $VAR je n'en tire aucune valeur !

echo $VAR

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

1 votes

Vous pourriez essayer d'utiliser un alias au lieu d'un script pour définir votre variable.

0 votes

Le script sur lequel je travaille, est une sorte de gestionnaire virtuel java, je fais quelques calculs alors je devrais exporter un $JAVA_HOME à l'env, et l'ajouter à PATH.

0 votes

Vous pourriez écrire les informations dans un fichier et les relire ensuite, mais le sourcing semble beaucoup plus facile.

445voto

Keith Thompson Points 85120

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

Réponse rapide : Non.

Mais il existe plusieurs solutions de contournement possibles.

La plus évidente, que vous avez déjà mentionnée, est d'utiliser source o . 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 est de faire en sorte que le script, plutôt que de définir une variable d'environnement, imprime 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

Une troisième approche est d'avoir un script qui définit votre/vos variable(s) d'environnement en interne et ensuite invoque 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 qu'elle soit peu pratique pour une utilisation interactive puisqu'elle ne vous donne pas les paramètres de votre shell actuel (avec tous les autres paramètres et l'historique que vous avez construit).

0 votes

Pourriez-vous expliquer la troisième approche concernant exec "$@" y printenv chose ? De plus, comment utiliser les 2ème et 3ème approches dans le cas où le script prend des arguments ?

0 votes

J'ai un script qui prend des arguments. sudo . dd.sh $source $pathToUsb non trouvée ou eval "$(sudo dd.sh $source $pathToUsb)" sh : 1 : eval : Fichier : non trouvé sh : 2 : eval : Fichier : non trouvé ou si vous essayez ./dd.sh $source $pathToUsb printenv | grep line Je ne peux pas exécuter "@". Une idée ?

0 votes

El . est intégrée à l'interpréteur de commandes, elle n'est donc pas visible pour les utilisateurs de l'interface. sudo . Votre deuxième commande va essayer de eval le site sortie de la sudo dd.sh ... et je n'ai aucune idée de ce à quoi ressemble cette sortie. Est-ce que dd.sh imprimer des commandes qui peuvent être évaluées par le shell ?

80voto

vahid Points 2070

Afin d'exporter la variable VAR en premier lieu, la manière la plus logique et la plus logique de travailler est de trouver la source de la variable :

. ./export.bash

ou

source ./export.bash

Maintenant, lorsque l'on fait un écho depuis le shell principal, cela fonctionne :

echo $VAR
HELLO, VARIABLE

Nous allons maintenant réinitialiser la VAR :

export VAR=""
echo $VAR

Maintenant nous allons exécuter un script pour sourcer la variable puis la dévalider :

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

Le code : fichier 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 exécute les exportations dans votre console principale - donc, dans la mesure où un cron job Je l'ajouterais à la console comme ci-dessous... pour la partie commande toujours discutable : voici comment vous l'exécuteriez depuis votre shell :

Sur votre invite de commande (tant que le fichier export.bash fichier a plusieurs valeurs d'écho)

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

Fichier cat v1.sh

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

Maintenant, tant que c'est pour votre usage - vous pourriez 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 [fichier .bashrc](https://en.wikipedia.org/wiki/Bash(Unix_shell)#Legacy-compatible_Bash_startupexample) :

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 .bashrc et vous pouvez faire ce qui précède à tout moment...

Bref, revenons au reste...

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

Il suffit d'en faire l'écho et de lancer l'exportation sur l'écho !

Fichier export.bash

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

Maintenant dans script ou votre console exécutez :

export "$(./export.bash)"

Essayez :

echo $VAR
HELLO THERE

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

Fichier export.bash

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

Fichier 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 l'auto-assignation, lisez 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 :

Fichier 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

2 votes

Je veux exporter le VAR en exécutant le fichier, pas en le sourçant.

0 votes

@vahid vous devriez expliquer ce que fait votre script.

1 votes

Pourquoi ne pas annuler la variable après le sourcing ? ce serait beaucoup plus facile que la douleur que vous essayez de vous causer mettra à jour le test-export script.

38voto

mdornfe1 Points 682

Exécuter

set -o allexport

Toute variable provenant d'un fichier après ceci sera exportée dans votre shell.

source conf-file

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

set +o allexport

20voto

bom_d_van Points 426

J'ai trouvé un moyen intéressant et soigné d'exporter des variables d'environnement à partir d'un fichier :

Dans le dossier vars.env. :

foo=test

Test script :

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. "--" stops processing options,
# key=value list given as parameters
export -- `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

9voto

Gonmator Points 396

Une autre solution de contournement qui, selon le cas, pourrait être utile : créer un autre bash script qui hérite de la variable exportée. C'est un cas particulier de Réponse de Keith Thompson mais tous ces inconvénients.

Exportation de fichiers.bash :

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

Maintenant :

./export.bash
echo $VAR

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X