Was macht der Befehl 'dot space filename' in bash?

30

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.

Iancoleman
quelle
23
Run help . Dies ist so kurz, dass die Stack Exchange-Engine denkt, es sei zu kurz, um einen Kommentar abzugeben.
Wildcard
5
Ich frage mich, warum all diese Fragen auch auf dieser Website auftreten. Sie wurden in Stack Overflow , Ask Ubuntu und Unix & Linux oft beantwortet .
Fedorqui
Um Punkt-Leerzeichen auszuführen, müssen Sie '. ' argseinfache 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).
Peter Cordes
1
In der bash für einen alternativen Name .ist source, was wörtlich bedeutet „Quelle Befehl aus dieser Datei,“ zumindest für mich.
Jpaugh

Antworten:

40

Der .Befehl ("Punkt") ist ein Synonym / eine Abkürzung für den eingebauten sourceBefehl 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.

Spiff
quelle
49
Tatsächlich sourcehandelt es sich um ein nicht standardmäßiges und nicht portierbares Synonym / eine Abkürzung für den POSIX-definierten. Befehl "dot" ( ), nicht umgekehrt.
Terdon
8
bash bietet einen Nicht-Standard- sourceund 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 durchsucht source. In keinem Modus ist dies sourcegleichbedeutend mit dem POSIX- .Befehl.
HDV
26

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.shmit folgendem Inhalt:

cd dir

Wenn ich dieses Skript normal ausführen würde ( sh script.sh), würde ich Folgendes sehen:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

Aber wenn ich das Skript ( . script.sh) als Quelle hätte, hätte ich folgendes Ergebnis:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

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 shProzess , den wir mit dem Start sh-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!

Olle Kelderman
quelle
4

Hier ist ein Beispiel.

Skriptdatei: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

Wenn Sie versuchen, eine der oben genannten Variablen zu drucken, erhalten Sie nichts

echo $myvar

aber wenn du es tust

. mytest.sh

oder

source mytest.sh

und dann

echo $myvar

es wird 1 gedruckt

Nur eine visuelle Antwort auf das, was Spiff geschrieben hat

Raismus
quelle
exportWenn Sie also Ihr Beispiel interpretieren, verwenden Sie nur, wenn diese Variablen in Subshells verwendet werden sollen. Ich könnte exportin der Datei weglassen, wenn die Variablen nur in der aktuellen Shell verwendet werden sollen. Ist das richtig?
Iancoleman
1
Ganz richtig und ich könnte ja sagen. Die Verwendung des Befehls export ist jedoch nützlicher oder verständlicher, wenn Sie an die Shell-Umgebungsvariablen denken. Zum Beispiel $ HOME oder $ DISPLAY. Ja, Sie können den Befehl export verwenden, um eine Variable in Ihrer Shell-Sitzung oder in anderen Subshells zu exportieren. Sie wird jedoch gelöscht, sobald Sie diese Sitzung beenden.
Raism