Wenn ich die Bash-Shell verwende, speichere ich Umgebungsvariablen manchmal in einer Textdatei, deren Inhalt ich kopiere/einfüge, z. B. exports.txt:
export FOO=bar
export FIZZ=buzz
Jemand hat mir gezeigt, dass ich statt Kopieren/Einfügen in das Terminal tippen kann
. exports.txt
was den gleichen Effekt wie Kopieren/Einfügen hätte.
Welchen Mechanismus verwendet dieser Befehl „dot space filename“? Es ist schwer, sich Suchbegriffe dafür auszudenken.
Ich möchte verstehen, was passiert und die allgemeineren Einzelheiten dieses Einzeilers erfahren.
Antwort1
Der .
Befehl („Punkt“) ist ein Synonym/eine Abkürzung für den integrierten source
Befehl der Shell.
Dadurch wird das benannte Shell-Skript eingelesen und im aktuellen Shell-Kontext (und nicht in einer Untershell) ausgeführt. Dadurch kann das Quellskript die Umgebung der aufrufenden Shell ändern, z. B. Variablen festlegen und Shell-Funktionen und Aliase definieren.
Antwort2
Obwohl die beiden vorhandenen Antworten bereits ausgezeichnet sind, fehlt meiner Meinung nach das Beispiel, bei dem der Effekt sozusagen am „spürbarsten“ ist.
Angenommen, ich habe eine Datei script.sh
mit 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:~$
Wenn ich das Skript jedoch als Quelle angeben würde ( . script.sh
), würde ich Folgendes erhalten:
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 in den anderen Antworten erwähnt), dass das erste Beispiel in seiner eigenen Subshell ausgeführt wird (der sh
Prozess, den wir mit dem sh
-Befehl starten, das hätte im Grunde jede beliebige Shell sein können, bash
, dash
, was auch immer), es wechselt dort das Verzeichnis, tut nichts und schließt. Während das zweite Beispiel in unserer Hauptshell ausgeführt wird und daher dort das Verzeichnis wechselt!
Antwort3
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 auszudrucken, erhalten Sie nichts
echo $myvar
aber wenn du das 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