J'ai écrit le script suivant pour définir certaines variables d'environnement lorsque cela est nécessaire.
#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH
Ci-dessous la commande et les résultats que je peux voir sur mon terminal: le script s'exécute, mais les variables ne sont pas définies à la fin.
~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE
~$:
Qu'est-ce qui ne va pas? Merci d'avance. Mirko
export
exporte l'affectation de variable vers les processus enfants du shell dans lequel la commande export
a été exécutée. Votre environnement de ligne de commande est le parent du shell du script; il ne voit donc pas l'affectation de variable.
Vous pouvez utiliser la commande bash .
(ou source
) pour exécuter les commandes de script dans l'environnement Shell actuel et obtenir ce que vous souhaitez, par exemple.
source ./script.sh
echo "$BASE"
Produira
/home/develop/trees
La commande source
, souvent observée dans les scripts, est un synonyme bash de .
, qui fait partie du standard POSIX (donc .
est disponible au tiret, par exemple, mais source
ne l’est pas).
. ./script.sh # identical to "source ./script.sh"
(. script.sh
et source script.sh
vont d'abord rechercher script.sh
dans PATH
, il est donc plus sûr de spécifier le chemin d'accès à script.sh
.)
Lorsque vous exécutez un script, il s'exécute dans un sous-shell. Les variables ne sont valables que dans le contexte de ce sous-shell. Définissez-les dans votre .bashrc
ou .profile
et lisez-le sur variables et sous-shell . L'instruction export
fonctionne dans la hiérarchie (le shell actuel et tous ses sous-shell) pas comme dans votre exemple.
Alternativement (si vous voulez vraiment que le script affecte l'environnement de votre Shell actuel), exécutez-le comme suit:
. ./script.sh
Cela provoque son exécution dans votre Shell actuel mais ne transmet pas non plus de variables dans la hiérarchie.
Je veux souvent définir une variable d'environnement sans tracas.
Voici ce que j'ajoute à mon .bashrc pour implémenter cette commodité.
defect() {
if [ $1 ] && [ -z $2 ]
then
eval 'export DEFECT=$1'
return 0
else
echo 'Usage: defect {number}'
return 1
fi
}