BASH-Skript zum Setzen von Umgebungsvariablen, die nicht funktionieren

137

Ich habe das folgende Skript geschrieben, um bei Bedarf einige Umgebungsvariablen festzulegen.

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

Unterhalb des Befehls und der Ergebnisse, die ich auf meinem Terminal sehen kann: Das Skript wird ausgeführt, aber die Variablen werden am Ende nicht gesetzt.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

Was ist los mit dir? Danke im Voraus. Mirko

MirkoZa
quelle

Antworten:

194

exportExportiert die Variablenzuweisung an untergeordnete Prozesse der Shell, in der der exportBefehl ausgeführt wurde. Ihre Befehlszeilenumgebung ist das übergeordnete Element der Skript-Shell, daher wird die Variablenzuweisung nicht angezeigt.

Sie können den Befehl .(oder source) bash verwenden, um die Skriptbefehle in der aktuellen Shell-Umgebung auszuführen und das zu erreichen, was Sie möchten, z

source ./script.sh
echo "$BASE"

Wird herstellen

/home/develop/trees

Der sourceBefehl, der häufig in Skripten verwendet wird, ist ein Bash-Synonym für ., das Teil des POSIX-Standards ist (also .beispielsweise in Bindestrich verfügbar ist, dies aber sourcenicht ist).

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

( . script.shund source script.shwird zuerst nach script.shin suchen PATH, daher ist es sicherer, den Pfad zu anzugeben script.sh.)

muru
quelle
29
Sie müssen keine exportVariablen an Subshells übergeben, eine Subshell ist eine Kopie Ihrer aktuellen Shell, einschließlich Variablen und Funktionen usw. Exportierte Variablen werden in neue Prozesse kopiert, die von der Shell erzeugt werden, unabhängig davon, ob dieser Prozess eine andere Shell ist oder nicht. Zweitens .ist der POSIX-Befehl für die Beschaffung. Bash wird sourceals besser lesbares Synonym hinzugefügt, aber Sie können sich nicht darauf verlassen, dass es in sh verfügbar ist. Und . ./scriptnicht zuletzt, . scriptwenn Sie Überraschungen vermeiden möchten. mywiki.wooledge.org/BashFAQ/060
geirha
Beachten Sie, dass die Quellumgebung für übergeordnete Elemente nicht verfügbar ist, wenn Sie ein Skript ausgeben UND eine Pipe verwenden. zB 'source setit.sh' ist okay. 'source setit.sh | tee setit.log' ist nicht in Ordnung. Überraschend. Nicht intuitiv.
Gaoithe
10

Wenn Sie ein Skript ausführen, wird es in einer Subshell ausgeführt. Variablen sind nur im Kontext dieser Subshell gültig. Setzen Sie sie in Ihr .bashrcoder und informieren.profile Sie sich über Variablen und Unterschalen . Die exportAnweisung funktioniert hierachy down (aktuelle Shell und alle ihre Subshells) nicht wie in Ihrem Beispiel.

Alternativ (wenn Sie wirklich möchten, dass das Skript die Umgebung Ihrer aktuellen Shell beeinflusst), führen Sie es aus wie folgt:

. ./script.sh

Das führt dazu, dass es in Ihrer aktuellen Shell ausgeführt wird, aber auch keine Variablen in der Hierarchie weitergibt.

verwechseln
quelle
5

Ich möchte oft eine Umgebungsvariable ohne Aufwand festlegen.

Folgendes füge ich meinem .bashrc hinzu, um diesen Komfort zu implementieren.

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

Sie können so etwas versuchen

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