Worin besteht denn jetzt der Unterschied zw. den Variablen in nem "gesourcten" Skript und den exportierten Varis?
Source "." liest die Datei und führt diese im gleichen Prozess (bash) aus. Sonst wird eine neue Bash gestartet. Dabei kann der neue Prozess die Variable kennen oder nicht.
Beispiel: "Unterprogramm" foo
|
Quellcode
|
1
2
3
4
|
$ cat foo
#!/bin/sh
echo "Test: ${TEST}"
|
Wenn du das innerhalb einer bash aufrufst wird *immer* ein neuer Prozess gestartet(!).
Es wird die Variable TEST auf der console ausgegeben.
1. Definieren der Variable und "Aufruf" von foo. Wenn die Variable nicht exportiert wird, kennt der neue Kind-Prozess (die neue Shell) die Variable nicht. Folglich bleibt die console leer
|
Quellcode
|
1
2
3
4
5
6
7
|
$ cat ./bar_1
#!/bin/sh
TEST="Das ist ein Test"
./foo
$ ./bar_1
Test:
|
2. Mit export. Jetzt wird auch eine neue Shell gestartet, aber diesmal wird dem neuen Prozess die Variable als Umgebungsvariable hinzugefügt.
|
Quellcode
|
1
2
3
4
5
6
7
|
$ cat bar_2
#!/bin/sh
export TEST="Das ist ein Test"
./foo
$ ./bar_2
Test: Das ist ein Test
|
3. Mit Source oder einfach nur "." . Hier wird *kein neuer Prozess* gestartet, sondern die angegebene Datei eingelesen und im gleichen Prozess ausgeführt.
|
Quellcode
|
1
2
3
4
5
6
7
|
$ cat bar_3
#!/bin/sh
TEST="Das ist ein Test"
. ./foo
dyle@demandred ~ $ ./bar_3
Test: Das ist ein Test
|
Warum du all diese Möglichkeiten hast, hat viele verschiedene Gründe. Es läßt sich aber keine Faustregel angeben, was besser wäre.
Zu beobachten ist, das meist ein Satz von Variablendefinitionen in solchen Dateien drin sind und diese dann für div. Aufgaben reingesourced werden.