Was ist der Unterschied zwischen dem Ausführen eines Skripts wie folgt:
./test.sh
und Ausführen eines Skripts wie folgt:
. test.sh
?
Ich habe ein einfaches zweizeiliges Skript ausprobiert, um festzustellen, ob es einen Unterschied gibt:
#!/bin/bash
ls
Aber beide . test.sh
und ./test.sh
die gleichen Informationen zurückgegeben.
test.sh
es nicht dasselbe ist wie./test.sh
(der erste ruft einePATH
Suche auf), so sind es auch. test.sh
und. ./test.sh
auf die gleiche Weise anders (der erste ruft eine Suche aufPATH
). Viele Shells scheinen.
am EndePATH
einer.
Pfadsuche implizit enthalten zu sein , aber dieses Verhalten ist nicht Standard. Somit ist es genauer,test.sh
vs. test.sh
und./test.sh
vs zu vergleichen. ./test.sh
.Antworten:
./test.sh
läufttest.sh
als separates Programm. Es kann passieren, dass es sich um ein Bash-Skript handelt, wenn die Datei mittest.sh
beginnt#!/bin/bash
. Es könnte aber auch etwas anderes sein.. ./test.sh
Führt den Code der Dateitest.sh
in der laufenden Instanz von bash aus. Es funktioniert so, als ob die Inhaltsdateitest.sh
anstelle der. ./test.sh
Zeile in Textform eingefügt worden wäre . (Fast: Es gibt einige Details, die sich unterscheiden, z. B. den Wert$BASH_LINENO
und das Verhalten desreturn
eingebauten Moduls.)source ./test.sh
ist identisch mit. ./test.sh
in bash (in anderen Shellssource
kann es geringfügig anders sein oder gar nicht existieren;.
für die Aufnahme in den POSIX-Standard).Der am häufigsten sichtbare Unterschied zwischen dem Ausführen eines separaten Skripts mit
./test.sh
und dem Einschließen eines Skripts mit dem.
eingebauten Skript besteht darin, dass, wenn dastest.sh
Skript einige Umgebungsvariablen mit einem separaten Prozess festlegt, nur die Umgebung des untergeordneten Prozesses festgelegt wird, während bei Einbeziehung des Skripts die Umgebung des Sole-Shell-Prozesses wird festgelegt. Wenn Sie eine Zeilefoo=bar
intest.sh
undecho $foo
am Ende des aufrufenden Skripts einfügen, sehen Sie den Unterschied:quelle
echo $$
zum Skript wird den Unterschied deutlich machen. Die$$
Variable enthält die PID der aktuellen Shell.. ./test.sh
Aufrufs aus einem anderen Shell-Skript, um Funktionen zu verwenden, die in test.sh beschrieben werden. Ich meine, Sie können nicht nur Variablen festlegen, sondern auf diese Weise auch neue Funktionen erstellen, die dann über Bash oder ein anderes Skript aufgerufen werden können.. /usr/libexec/company/tools; custom_command "variable
"Wenn Sie ein Skript auf die erste Art ausführen, wird es als untergeordneter Prozess ausgeführt. Sourcing hingegen führt das Skript so aus, als ob Sie alle Befehle in die aktuelle Shell eingegeben hätten. Wenn das Skript eine Variable setzt, bleibt diese gesetzt. Wenn das Skript beendet wird, wird Ihre Sitzung beendet. Siehe
help .
für die Dokumentation.quelle
Eine andere Sache, die ich bemerke, ist, dass wenn Sie einen Alias wie diesen haben:
Mit erhalten
./test.sh
Sie eine normalels
Ausgabe (und eine andere PID als die aktuelle Shell):Mit
. test.sh
oder erhalten. ./test.sh
Sie eine detailliertere Ausgabe (und dieselbe PID wie in der aktuellen Shell):quelle
.bashrc
if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi
einfügen.bash_aliases
. Geben Sie dann Ihre Aliase ein .alias
Schlüsselwort nicht immer noch verwenden ? (Vielleicht ist das nur ein Fehler in Ihrem Beitrag - in Zeile 3?)Die Hauptverwendung für mich
source
(oder.
) sind Bash-Funktionen .Ich habe Skripte mit vielen Funktionen und führe sie alle mit meinem aus
.bashrc
. Die Funktionen "werden" Befehle, die ich oft benutze.quelle