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

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


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.


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
}

-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}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.