Was macht der Befehl „Punkt, Leerzeichen, Dateiname“ in Bash?

Was macht der Befehl „Punkt, Leerzeichen, Dateiname“ in Bash?

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 sourceBefehl 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.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:~$

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 shProzess, 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

verwandte Informationen