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