2016-12-06 3 views
1

Wir haben ein Shell-Skript namens source.sh, das viele ENV-Variablen exportiert, die für einen Build benötigt werden.Umgebungsvariable nicht verfügbar für nächsten Befehl im Shell-Skript

Ich versuche, auf diese ENV-Variablen zugreifen, indem Sie source.sh in meinem Skript ausführen, aber auch nach dem Ausführen kann ich nicht auf ENV-Variablen für die folgenden Befehle zugreifen.

My Script gleich aussehen:

#!/bin/bash 

sh source.sh 
cd $ROOT_VOS 
make 

Aber hier cd $ ROOT_VOSis nicht passiert

+0

Als beiseite, es gibt keinen guten Grund, diese eine Umgebungsvariable gegen eine regelmäßige Schale zu machen Variablen- und POSIX-Konventionen geben den Namespace aller Großbuchstaben von Variablennamen an, die für Variablen mit Bedeutung für das Betriebssystem und die Shell verwendet werden sollen, wobei Kleinbuchstaben für die Verwendung durch die Anwendung reserviert sind. (Formal ist das für Umgebungsvariablen angegeben, aber das Setzen einer regulären Shell-Variablen überschreibt eine gleichnamige Umgebungsvariable, so dass die Konvention an beiden Stellen notwendigerweise gilt.) –

Antwort

1

sh source.sh

... läuft source.sh in einer separaten Kopie von sh (tatsächlich, da Ihre Eltern-Shell ist bash und das Kind ist sh, es ist nicht nur eine "separate Kopie", es ist ein ganz anderer Interpreter). Wenn dieser separate Interpreter beendet wird, sind lokale Variablen und andere Änderungen am prozesslokalen Status nicht mehr vorhanden. (Umgebungsvariablen werden von untergeordneten Prozessen geerbt; sie werden nicht an die übergeordneten Elemente weitergegeben).


Verwenden Sie stattdessen:

# POSIX-compliant: execute every command in source.sh in the current shell 
. source.sh 

... oder ...

# bash-specific, perhaps more-readable, synonym for the same 
source source.sh 
Verwandte Themen