183 votes

BASH script pour définir les variables d'environnement ne fonctionne 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

259voto

export exporte l'affectation de la variable vers les processus enfants du Shell dans lequel la export a été exécutée. Votre environnement de ligne de commande est le parent du script du script, donc il ne voit pas l'affectation de la variable.

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

source ./script.sh
echo "$BASE"

Produira

/home/develop/trees

El source souvent vue dans scripts, est un synonyme bash de . qui fait partie de la norme POSIX. . est disponible en tiret, par exemple, mais source ne l'est pas).

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

( . script.sh y source script.sh cherchera d'abord script.sh en PATH il est donc plus sûr de spécifier le chemin d'accès à script.sh .)

20voto

con-f-use Points 17925

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 o .profile et lire sur variables et sous-ensembles . Le site export fonctionne vers le bas de la hiérarchie (Shell actuel et tous ses sous-shells) et non vers le haut comme dans votre exemple.

Alternativement (si vous voulez vraiment que le script affecte l'environnement de votre script actuel) exécutez-le comme :

. ./script.sh

Cela permet de l'exécuter dans votre Shell actuel mais ne transmettra pas non plus les variables vers le haut de la hiérarchie.

7voto

jlettvin Points 181

Je souhaite souvent définir une variable d'environnement sans problème.

Voici ce que j'ajoute à mon .bashrc pour mettre en œuvre cette commodité.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X