web-dev-qa-db-fra.com

Script BASH pour définir les variables d'environnement ne fonctionnant pas

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

124
MirkoZa

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.)

177
user21322

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.

9
con-f-use

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
}
5
jlettvin