Question Script BASH pour définir les variables d'environnement qui ne fonctionnent pas


J'ai écrit le script suivant pour définir des variables d'environnement lorsque cela est nécessaire.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

Sous 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


102
2017-07-15 08:18


origine




Réponses:


export exporte l'affectation de variable à sous-coquilles, c’est-à-dire les coques qui sont lancées en tant que processus enfants du shell contenant le export directif. Votre environnement de ligne de commande est le parent du shell du script, il ne voit donc pas l'affectation de la variable.

Vous pouvez utiliser le source commande bash pour exécuter les commandes de script dans l'environnement shell actuel et obtenir ce que vous voulez, par exemple

source script.sh
echo $BASE

Produira

/home/develop/trees

le . commande est un synonyme de source ce qui est souvent vu dans les scripts.

. script.sh     # identical to "source script.sh"

146
2017-07-15 08:53



Vous n'avez pas besoin export pour passer des variables aux sous-couches, un sous-shell est une copie de votre shell actuel, y compris des variables et des fonctions, etc. Les variables exportées sont copiées vers les nouveaux processus générés depuis le shell, que ce processus soit ou non un autre shell. Deuxièmement, . est la commande POSIX pour le sourcing. Bash ajoute source comme un synonyme plus lisible, mais vous ne pouvez pas compter sur sa disponibilité en sh. enfin . ./script au lieu de . script si vous voulez éviter les surprises. mywiki.wooledge.org/BashFAQ/060 - geirha
Notez que si vous générez un script ET utilisez pipe, l'environnement source n'est pas disponible pour le parent. par exemple. 'source setit.sh' est correct. 'source setit.sh | tee setit.log' n'est pas correct. Surprenant. Pas intuitif. - gaoithe


Lorsque vous exécutez un script, il s'exécute dans un sous-shell. Les variables ne sont valides que dans le contexte de ce sous-shell. Placez-les dans votre .bashrc ou .profile et lire sur variables et sous-couches. le export L'affirmation fonctionne dans la hiérarchie (shell actuel et tous ses sous-couches) et non dans votre exemple.

Alternativement (si vous voulez vraiment que le script affecte l'environnement de votre shell actuel), lancez-le comme suit:

. ./script.sh

Cela provoque son exécution dans votre shell actuel mais ne transmettra pas non plus les variables dans la hiérarchie.


6
2017-07-15 08:48





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
}

4
2017-09-13 16:49





Vous pouvez essayer quelque chose comme ça

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}

-1
2018-01-11 10:14