laufendes Skript mit “. "Und mit" Quelle "

25
  1. Ich habe mich gefragt, ob die folgenden beiden Methoden zum Ausführen eines Bash-Skripts gleichwertig sind.

    . ./myScript.sh
    
    source myScript.sh
    
  2. Führen beide den Inhalt des Skripts aus, anstatt das Skript auszuführen, dh sie erstellen keine Subshell zum Ausführen des Skripts?
Tim
quelle
1
Hey, das ist in der Manpage!
Alex
@alex: zeig es mir bitte man ., man sourceOder was auch immer ich noch nicht kenne.
Tim
2
Siehe type .undhelp .
rozcietrzewiacz
man $SHELL,/source
alex
4
. ist tragbarer nach anderen.
l0b0

Antworten:

21
  1. Sie sind insofern äquivalent, als sie genau dasselbe tun. Auf der anderen Seite sourceist es 5 Zeichen länger und kann nicht auf POSIX-Shells oder Bourne übertragen werden, wohingegen .(Punkt) verwendet wird, sodass ich mich nie darum kümmere source.

  2. Das ist richtig. Wenn Sie eine Datei ausgeben, werden die Befehle in der aktuellen Shell ausgeführt, und dies wirkt sich auf Ihre aktuelle Shell-Umgebung aus. Sie können weiterhin Argumente an die Quelldatei übergeben, und Bash sucht tatsächlich nach $PATHdem Dateinamen wie bei einem normalen Befehl, wenn er keine Schrägstriche enthält.


Nicht im Zusammenhang mit der ursprünglichen Frage von .vs source, aber in Ihrem Beispiel

. ./myScript.sh 

ist nicht identisch mit

source myScript.sh

weil while .und sourcefunktional identisch sind myScript.shund ./myScript.shnicht gleich sind. Da es ./myScript.sheinen Schrägstrich enthält, wird er als Pfad interpretiert und von der Shell nur verwendet ./myScript.sh. Hat myScript.shjedoch keinen Schrägstrich, sodass die Shell zuerst danach sucht $PATH. Dies ist das POSIX-spezifizierte Standardverhalten für .. Die meisten Shells verwenden standardmäßig diese Option, obwohl sie möglicherweise Erweiterungen (z. B. die Suche im aktuellen Arbeitsverzeichnis nach der Pfadsuche) oder Optionen zum Ändern des Verhaltens von ./ hinzufügen source.

jw013
quelle
2
Das Verhalten, wenn der angegebene Pfad der Datei kein a enthält, /ist shellabhängig bashund zshhängt davon ab, ob der POSIX-Modus aktiviert ist oder nicht. Beachten Sie auch, dass sich ksh in vielen Implementierungen .anders verhält als source.
Stéphane Chazelas
@StephaneChazelas Ja, du hast recht. Ich habe einen Hinweis hinzugefügt, um zu verdeutlichen, dass es sich bei der obigen Beschreibung um den POSIX-Standard handelt.
jw013
8

Ja, sie sind gleichwertig. Es gibt keinen funktionalen Unterschied. .ist nur ein eingebautes Synonym für source.

(Edit: Anscheinend gilt das nur für bashund zsh. Einige leichtere Shells haben keine source, nur .wird sie von POSIX spezifiziert ksh, also dashmüssen ash, etc. nicht source. Siehe Antwort von jw013 für Infos.)

Caleb
quelle
Vielen Dank! Aber $ alias .Ausgänge bash: alias: .: not found .
Tim
Das heißt, sie sind beide eingebaut und der Alias ​​ist auch eingebaut. Dies ist dokumentiert , aber ich denke, "synonym" ist in diesem Fall der richtige Begriff, nicht "alias".
Caleb