Quelle vs. warum unterschiedliches Verhalten?

17

Das habe ich kürzlich gelernt

. ./.a.aund ./.a.aist das gleiche.

Jedoch source source .a.agibt das Versuchen einen Fehler. IMO, .ein Bash-Alias ​​für sourcesollte sich nicht anders verhalten, also was fehle ich?

Bonus, warum ist . .OK, wenn source sourcenicht?

LAFK sagt Reinstate Monica
quelle
8
Sie hätten einen klareren Namen für Ihr Beispiel wählen können :). Was hat Sie auf jeden Fall auf die Idee gebracht, dass . scriptund ./scriptdasselbe sind? Sie sind es mit Sicherheit nicht . Auch .ist kein Alias ​​zu source. Es ist anders herum. .ist der Standard und sourceist ein Alias ​​von ..
Terdon
2
Nachdem Sie sich einige Zeit mit Shell-Skripten beschäftigt haben, gewöhnen Sie sich an den .Befehl, aber ich meine, er sourceist einfach ein besserer Befehl. Wenn Sie source somefilein einem Skript sehen, wissen Sie sofort, was diese Anweisung bewirkt, aber . somefile nicht nur, was sie bewirkt. Sie können leicht den . Charakter insgesamt verpassen
the_velour_fog
Bonus, warum ist. . OK, während die Quelle die Quelle nicht ist? - in wie weit die Fehlermeldung bash: .: .: is a directoryauf . .ok Anforderungen erläutert.
Gegenmodus
@terdon - absolut richtig. Das ursprüngliche Beispiel war . ./.a.a ., um ehrlich zu sein. : -DA Quiz von Art, wenn Sie so wollen. :-) Verknüpfte Frage ist genial, vielen Dank. Was gab mir diese Idee: Die Tatsache, dass ich keinen Unterschied bei der Ausführung von Dateien auf diese Weise gesehen hatte und die Tatsache, dass ich irgendwo gelesen habe, .ist ein Alias ​​für source. :-)
LAFK sagt Reinstate Monica

Antworten:

27

Sie können nicht einfach ersetzen .mit sourceüberall; wenn

. ./.a.a

funktioniert, können Sie die erste ersetzen .(zumindest in Bash):

source ./.a.a

Das zweite .stellt das aktuelle Verzeichnis dar, das Sie nicht durch ersetzen können source(besonders nicht ./durch, sourcewie Sie es getan haben).

source source

wäre OK, wenn Sie eine Datei sourceim aktuellen Verzeichnis hätten, die etwas Bedeutendes für Ihre aktuelle Shell enthält. Ich kann nicht sehen, wie es . .wäre ...

Außerdem , . ./.a.aund ./.a.asind nicht die gleichen, die zweite Form läuft .a.ain einer separaten Schale. Siehe Was ist der Unterschied zwischen dem Sourcing ('.' Oder 'source') und dem Ausführen einer Datei in Bash? für Details.

Stephen Kitt
quelle
9

sourceist ein Shell-Schlüsselwort, das wie folgt verwendet werden soll: sourcefilewhere fileenthält gültige Shell-Befehle. Diese Shell-Befehle werden in der aktuellen Shell ausgeführt, als würden sie über die Befehlszeile eingegeben. Jetzt .filemacht genau das gleiche.

Darüber hinaus .bedeutet allein "das aktuelle Arbeitsverzeichnis" wie in ./xyz(" xyzin diesem Verzeichnis") oder a/b/./c/./d(das ist identisch mit a/b/c/d).

Darüber hinaus hat .in einem Dateinamen eine Bedeutung nur durch Konvention wie in, .foobardie eine "versteckte" Datei anzeigt (nicht wirklich ...) oder wie in foobar.pdf, die ein Dateiformat durch das Suffix anzeigt (hier .pdf).

Diese unterschiedlichen Bedeutungen können nicht vertauscht werden.

Gegenmodus
quelle
8
.ist in keiner Weise veraltet. Anders sourceals bei der portablen, POSIX-definierten Art, eine Datei zu beschaffen. Der sourceAlias ​​ist shell-spezifisch und kann entweder fehlen (zum Beispiel in dash) oder sich anders als der Standard verhalten ..
Terdon
Danke @terdon, Wiki sagt, dass die Quelle als Punkt (.) In der C-Shell, in der der Befehl zuerst erschien, nicht akzeptabel ist.
Noam Manos
1
@ NoamManos vielleicht, aber die C-Shell ist nicht POSIX, so kann (und tut) es sehr unterschiedlich verhalten.
terdon