Bei Verwendung der Bash-Shell behalte ich manchmal Umgebungsvariablen in einer Textdatei, die ich kopiere / füge, z. B. exports.txt:
export FOO=bar
export FIZZ=buzz
Jemand hat mir gezeigt, dass ich anstelle von Kopieren / Einfügen das Terminal eingeben kann
. exports.txt
Das hätte den gleichen Effekt wie Kopieren / Einfügen.
Wie funktioniert dieser Befehl für den Dateinamen im Punktbereich? Es ist schwer, Suchbegriffe dafür zu finden.
Ich möchte verstehen, was passiert und was dieser Einzeiler im Detail macht.
help .
Dies ist so kurz, dass die Stack Exchange-Engine denkt, es sei zu kurz, um einen Kommentar abzugeben.'. ' args
einfache oder doppelte Anführungszeichen eingeben. Andernfalls wird der nicht zitierte Platz von der Bash aufgefressen, wenn die Zeile in Token zerlegt wird (siehe "Wortteilung" im Bash-Handbuch)..
istsource
, was wörtlich bedeutet „Quelle Befehl aus dieser Datei,“ zumindest für mich.Antworten:
Der
.
Befehl ("Punkt") ist ein Synonym / eine Abkürzung für den eingebautensource
Befehl der Shell .Es bewirkt, dass das benannte Shell-Skript im aktuellen Shell-Kontext (und nicht in einer Subshell) eingelesen und ausgeführt wird. Auf diese Weise kann das Quellenskript die Umgebung der aufrufenden Shell ändern, z. B. Variablen festlegen und Shell-Funktionen und Aliase definieren.
quelle
source
handelt es sich um ein nicht standardmäßiges und nicht portierbares Synonym / eine Abkürzung für den POSIX-definierten.
Befehl "dot" ( ), nicht umgekehrt.source
und einen Nicht-Standard.
-Modus im Nicht-POSIX-Modus. Beide durchsuchen das aktuelle Verzeichnis, auch wenn es nicht Teil von ist$PATH
. Im POSIX-Modus wird ein Standard.
bereitgestellt, der das aktuelle Verzeichnis nicht durchsuchtsource
. In keinem Modus ist diessource
gleichbedeutend mit dem POSIX-.
Befehl.Während die beiden vorhandenen Antworten bereits hervorragend sind, fühle ich, dass das Beispiel, bei dem der Effekt sozusagen "am auffälligsten" ist, fehlt.
Angenommen, ich habe eine Datei
script.sh
mit folgendem Inhalt:Wenn ich dieses Skript normal ausführen würde (
sh script.sh
), würde ich Folgendes sehen:Aber wenn ich das Skript (
. script.sh
) als Quelle hätte, hätte ich folgendes Ergebnis:Beachten Sie, wie sich im zweiten Fall das Arbeitsverzeichnis unserer Haupt-Shell geändert hat!
Dies liegt daran , (wie erwähnt in den anderen Antworten) das erste Beispiel läuft in seinem eigenen Subshell (der
sh
Prozess , den wir mit dem Startsh
-command haben diese jede Schale im Grunde sein können,bash
,dash
, nennen Sie es), es ändert Verzeichnis gibt, tut nichts und schließt. Während das zweite Beispiel in unserer Haupt-Shell läuft und somit dort das Verzeichnis wechselt!quelle
Hier ist ein Beispiel.
Skriptdatei: mytest.sh
Wenn Sie versuchen, eine der oben genannten Variablen zu drucken, erhalten Sie nichts
aber wenn du es tust
oder
und dann
es wird 1 gedruckt
Nur eine visuelle Antwort auf das, was Spiff geschrieben hat
quelle
export
Wenn Sie also Ihr Beispiel interpretieren, verwenden Sie nur, wenn diese Variablen in Subshells verwendet werden sollen. Ich könnteexport
in der Datei weglassen, wenn die Variablen nur in der aktuellen Shell verwendet werden sollen. Ist das richtig?