Was ist der Unterschied zwischen der Ausführung eines Skripts wie diesem:
./test.sh
und Ausführen eines Skripts wie diesem:
. test.sh
?
Ich habe ein einfaches, zweizeiliges Skript ausprobiert, um zu sehen, ob ich einen Unterschied feststellen kann:
#!/bin/bash
ls
Aber beide . test.sh
und ./test.sh
gab die gleichen Informationen zurück.
Akzeptierte Antwort:
./test.sh
führt test.sh
aus als separates Programm. Es kann sich um ein Bash-Skript handeln, wenn die Datei test.sh
beginnt mit #!/bin/bash
. Aber es könnte auch etwas ganz anderes sein.
. ./test.sh
führt den Code der Datei test.sh
aus innerhalb der laufenden Instanz von bash. Es funktioniert so, als ob die Inhaltsdatei test.sh
anstelle des . ./test.sh
Linie. (Fast:es gibt ein paar Details, die sich unterscheiden, wie zum Beispiel der Wert von $BASH_LINENO
, und das Verhalten des return
eingebaut.)
source ./test.sh
ist identisch mit . ./test.sh
in bash (in anderen Shells source
kann etwas anders sein oder überhaupt nicht vorhanden sein; .
für die Aufnahme ist im POSIX-Standard).
Der am häufigsten sichtbare Unterschied zwischen dem Ausführen eines separaten Skripts mit ./test.sh
und Einfügen eines Skripts mit dem .
eingebaut ist das wenn die test.sh
script setzt einige Umgebungsvariablen, bei einem separaten Prozess wird nur die Umgebung des untergeordneten Prozesses gesetzt, während bei der Skripteinbindung die Umgebung des einzigen Shell-Prozesses gesetzt wird. Wenn Sie eine Zeile foo=bar
hinzufügen in test.sh
und echo $foo
Am Ende des aufrufenden Skripts sehen Sie den Unterschied:
$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo
$ . ./test.sh
$ echo $foo
bar