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 ?
7 réponses
y a-t-il un moyen d'accéder au
$VAR
en exécutant simplementexport.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).
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
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
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
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
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.
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.