Antworten:
Ein Punkt in diesem Kontext bedeutet, den Inhalt dieser Datei in die aktuelle Shell zu "importieren". Mit source
sich selbst ein Shell-Builtin-Befehl. Und source
und der Punktoperator sind Synonyme.
Angenommen, ich hatte den folgenden Inhalt in einer sample.sh
Datei.
$ cat sample.sh
echo "hi"
echo "bye?"
Wenn ich es jetzt beziehe:
$ . sample.sh
hi
bye?
$
Dateien wie diese werden häufig verwendet, um Setup-Befehle zu integrieren, z. B. um Dinge zu Umgebungsvariablen hinzuzufügen.
Angenommen, ich hatte diese Befehle in einer anderen Datei addvars.sh
.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Beachten Sie, dass die aktuelle Shell-Umgebung keine Variablen enthält.
$ env | grep VAR
$
Nun, wenn ich diese Datei quelle:
$ . addvars.sh
$
OK, es scheint nicht so, als hätte es irgendetwas getan, aber wenn wir die env
Variablen noch einmal überprüfen :
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Um die Antwort von slm zu ergänzen:
Es gibt zwei Möglichkeiten, ein Shell-Skript auszuführen. Zum einen muss das Skript in einem separaten Prozess ausgeführt werden, was bedeutet, dass die Umgebung der Shell (Speicherstatus) auf den Status der übergeordneten Shell zurückgesetzt wird, bevor der untergeordnete Shell-Prozess ausgeführt wird.
Beispielsweise wird das aktuelle Arbeitsverzeichnis (der Speicherort im Dateisystem, in dem sich eines befindet) pro Prozess ermittelt. Also, lassen Sie uns ein Skript haben, das so aussieht:
#!/bin/bash
cd ~
cd ..
pwd
Nennen wir dieses Skript foo
. Und lassen Sie uns dieses Skript wie folgt ausführen:./foo
Wir werden folgendes sehen:
/home
(Standard-Haftungsausschluss, dass es eine große Anzahl von Linux- und anderen UNIX-Clone-Distributionen gibt, von denen einige keine Benutzerverzeichnisse enthalten /home
. Oder, wie wir früher sagten: "Ihre Laufleistung kann variieren")
Nachdem Sie dieses Skript ausgeführt haben, geben Sie diesen Befehl ein
pwd
Um zu sehen, in welchem Verzeichnis wir uns befinden, sehen wir etwa Folgendes:
/home/username
Der Grund dafür war wiederum, dass das von uns ausgeführte Shell-Skript eine eigene Umgebung hatte (einschließlich eines eigenen Verzeichnisses, in dem Befehle ausgeführt wurden), und diese Umgebung verschwand, sobald das Skript ausgeführt wurde.
Lassen Sie uns das foo
Skript jetzt so ausführen
. ./foo
Oder äquivalent:
source ./foo
Wenn wir pwd
danach eine machen, werden wir folgendes sehen:
/home
Der Grund dafür ist: Die Beschaffung eines Skripts ruft keinen separaten Prozess auf. Es ist so, als würden Sie alle Befehle im übergeordneten Prozess von Hand eingeben. Die Umgebung bleibt nach Beendigung des Skripts erhalten.
Lassen Sie mich ein einfacheres Beispiel nennen. Lassen Sie uns ein Skript erstellen, das so aussieht:
#!/bin/bash
exit
Nennen wir es foo
. Lassen Sie uns sicherstellen , dass wir es laufen kann: chmod 755 foo
. Dann lassen Sie es uns so laufen:
./foo
Nichts passiert. Auf der anderen Seite, wenn wir dies tun:
. ./foo
Oder dieses:
source ./foo
Wir melden uns ab.
Der Punkt steht für die eingebaute Bash source
. Es liest und führt Befehle aus einer Datei in der aktuellen Umgebung aus und gibt den Beendigungsstatus des zuletzt ausgeführten Befehls zurück. Die Dateien können sich im aktuellen Verzeichnis oder an einer beliebigen Stelle im Internet befinden PATH
. Es muss nicht ausführbar sein.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (Quell- oder Punktoperator)
Liest und führt Befehle aus dem Dateinamenargument im aktuellen Shell-Kontext aus.
Syntax
. filename [arguments]
source filename [arguments]
source ist ein Synonym für dot / period '.' In Bash, aber nicht in POSIX sh. Verwenden Sie für maximale Kompatibilität den Punkt.
Wenn ein Skript unter Verwendung von source ausgeführt wird, wird es in der vorhandenen Shell ausgeführt. Alle vom Skript erstellten oder geänderten Variablen bleiben nach Abschluss des Skripts verfügbar. Im Gegensatz dazu wird, wenn das Skript nur als Dateiname ausgeführt wird, eine separate Subshell (mit einem vollständig separaten Satz von Variablen) erstellt, um das Skript auszuführen.
Es gibt einen subtilen Unterschied zwischen der Ausführung eines Skripts durch Ausführen von .ss64script (dot ss64script) und. ss64script (Punktraum ss64script)
Die erste Option führt eine Datei aus, die vor dem Befehl 'ls' verborgen ist (obwohl ls -a verborgene Dateien anzeigt). Die zweite Option führt ss64script aus, selbst wenn sie nicht als ausführbare Datei mit chmod festgelegt wurde.
TL; DR
Der Punkt ist derselbe wie der Quellbefehl.
source ist ein Unix-Befehl, der die Datei nach dem Befehl als eine Liste von Befehlen auswertet, die im aktuellen Kontext ausgeführt werden.