cubic83
Goto Top

Was bedeutet der Punkt vor dem Aufruf eines Skripts

Hallo,

ich habe hier ein Bash Skript vom Kollegen. Dieses Skript ruft ein weiteres Skript auf und benutzt Variablen aus dem ersten Skript. Wieso kann man im zweiten Skript nur auf die Variablen Zugreifen wenn man das zweite Skript mit einem Punkt startet. Hier ein Beispiel:

Datei 1

#!/bin/sh

VARI="Hallo"  
. ./DATEI2.sh

Datei 2
#!/bin/sh
echo $VARI

Ist der Code so geschrieben klappt es. Lass ich den Puntk weg ist $VARI leer ("./DATEI2.sh" anstatt ". ./DATEI2.sh")

Weiss vielleicht jemand wieso das so ist?

Danke schön,
mfG

Content-Key: 164199

Url: https://administrator.de/contentid/164199

Printed on: April 19, 2024 at 17:04 o'clock

Member: Crusher79
Crusher79 Apr 08, 2011 at 07:12:31 (UTC)
Goto Top
Hi,

bin leider Bash Noob. Normal gibt aber ein einzelner Punkt das aktuelle Verzeichnis an. Wir sind quasi im akt. Verz und führen mit ./ das 2. Skript aus.
Member: dog
dog Apr 08, 2011 at 07:38:19 (UTC)
Goto Top
. ist der Include-Befehl in SH (in Bash gibt es auch noch source)
Dadurch wird die Datei praktisch in die andere eingesetzt.
Lässt du das weg wird die andere Datei schlicht aufgerufen und dann sind Variablen nur sichtbar, wenn sie exportiert wurden.
Member: Cubic83
Cubic83 Apr 08, 2011 at 07:54:25 (UTC)
Goto Top
Ah Ok,

wieder was dazu gelernt.

Vielen Dank
mfG
Member: reni09
reni09 Apr 10, 2011 at 20:31:51 (UTC)
Goto Top
Ich möchte es mal so erklären.

Normalerweise werden alle Scripte beim Starten in einer Sub-Shell abgearbeitet.
Das heißt, es gelten da nur Variablen, die auch in der Start (oder Vater-)Shell exportiert wurden.

In deinem 1. Script wird VARI aber nicht exportiert und damit diese Variable auch im nächsten Script gültig ist, wird es _ohne_ weitere Sub-Shell aufgerufen.
=> mit dem . wird also _keine_ weitere Sub-Shell aufgerufen, sondern das Script startet in der aktuellen Shell.

Oder Datei 1 so:

#!/bin/sh
export VARI="Hallo"  
sh ./DATEI2.sh
Member: Cubic83
Cubic83 Apr 11, 2011 at 17:46:10 (UTC)
Goto Top
Hallo,

danke für den Kommentar.

Was bedeutet denn eigentlich exportiert? Wird die Variable dann zu einer Supervariable (also im System definiert) oder ist sie nur im Hauptskript und den Unterskripts (Untershells) definiert?

mfG
Member: Biber
Biber Apr 11, 2011 at 17:56:50 (UTC)
Goto Top
Moin Cubic83,

Letzteres. Die Variable steht in der aktuellen Umgebung (=in der aktuellen Shell-Instanz) zur Verfügung und ist dort sichtbar.
UND in allen "Child"-Instanzen, also neuen Shells (oder Unterprogrammen), die von ihr aufgerufen/neu gestartet werden.

Das darüberliegende "Super"-Environment ist zwar verfügbar (sichtbar), kann aber nicht dauerhaft geändert oder gar gelöscht werden.

Grüße
Biber