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

107

J'ai écrit le script suivant pour définir des variables d'environnement si 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 visibles 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

    
posée MirkoZa 15.07.2011 - 10:18
la source

4 réponses

153

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. Par conséquent, il ne voit pas l'affectation de variable.

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

source ./script.sh
echo "$BASE"

produira

/home/develop/trees

La commande source , souvent vue dans les scripts, est un synonyme bash de . , qui fait partie du standard POSIX (donc, . est disponible au tiret, par exemple, mais source n'est pas ).

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

( . script.sh et source script.sh vont d'abord chercher script.sh dans PATH , il est donc plus sûr de spécifier le chemin d'accès à script.sh .)

    
réponse donnée user21322 15.07.2011 - 10:53
la source
7

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 vos .bashrc ou .profile et lisez-les sur les variables et les 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 en tant que:

. ./script.sh

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

    
réponse donnée con-f-use 15.07.2011 - 10:48
la source
4

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
}
    
réponse donnée jlettvin 13.09.2013 - 18:49
la source
-1

Vous pouvez essayer quelque chose comme ceci

CURRENT_DIR='pwd'
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
    
réponse donnée silentsudo 11.01.2017 - 11:14
la source

Lire d'autres questions sur les étiquettes