Was bedeutet Backslash Dot als Befehl?

17

Eine Software, die ich installiert habe, hat eine Zeile in mein Profil eingefügt, die lautet:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

Ich weiß, dass Punkt .gleichbedeutend ist source, also vermute ich, dass dies nur die Quelle der Datei ist, aber ich habe es noch nie \.zuvor gesehen . macht es etwas anderes

Bearbeiten, in Bezug auf DVs: Die Suche nach "Backslash Dot" führt zu Fragen ./beim Aufrufen von ausführbaren Dateien und man sourceführt zu einer Hilfeseite, auf der nichts angezeigt wird\. . Ich weiß nicht, was ich sonst noch versuchen soll, daher die Frage.

Bearbeiten 2: Siehe verwandte Fragen

Sheljohn
quelle

Antworten:

31

Ein Backslash außerhalb von Anführungszeichen bedeutet, dass das nächste Zeichen beim Parsen buchstäblich interpretiert wird. Da .ist ein gewöhnliches Zeichen für den Parser, \.wird auf die gleiche Weise analysiert wie .und ruft das Builtin auf .(wofür sourcein bash ein Synonym steht).

Es gibt einen Fall, in dem dies einen Unterschied machen könnte. Wenn ein Benutzer einen .zuvor aufgerufenen Alias ​​definiert hat .profileund .profilein einer Shell gelesen wird, die Aliase erweitert (was Bash standardmäßig nur beim interaktiven Aufruf ausführt ), .würde er den Alias ​​auslösen, aber \.trotzdem den eingebauten Alias auslösen, da die Shell Versucht nicht, Alias-Erweiterungen für Wörter vorzunehmen, die in irgendeiner Weise zitiert wurden.

Ich vermute, dass dies .in geändert wurde, \.weil sich ein Benutzer beschwert hat, nachdem er einen Alias ​​für erstellt hatte ..

Beachten Sie, dass \.eine aufgerufene Funktion aufgerufen würde .. Vermutlich sind Benutzer, die Funktionen schreiben, besser informiert als Benutzer, die Aliase schreiben, und wissen, dass die Neudefinition eines Standardbefehls .profileeine schlechte Idee ist, wenn Sie Code von Drittanbietern einbinden. Wenn Sie jedoch sowohl Aliase als auch Funktionen umgehen möchten, können Sie schreiben command .. Der Autor dieses Snippets tat dies auch nicht, weil er sich für antike Muscheln interessierte, die nicht über die commandeingebaute Technologie verfügten, oder weil er sich dessen wahrscheinlich nicht bewusst war.

Das Definieren eines Alias ​​in .profileist übrigens eine schlechte Idee, da .profilees sich um ein Sitzungsinitialisierungsskript und nicht um ein Shell- Initialisierungsskript handelt. Aliase für Bash gehören in .bashrc.

Gilles 'SO - hör auf böse zu sein'
quelle
9

Das \.ist ein "wörtlicher Punkt", also nur ein Punkt. Es wird als Standardbefehl verwendet .(ähnlich wie sourcein bash).

Der POSIX-Standard hat dies zu sagen (mein Schwerpunkt)

A <backslash>, das nicht in Anführungszeichen steht, behält den Literalwert des folgenden Zeichens bei , mit Ausnahme von a <newline>. Wenn a dem <newline>folgt <backslash>, interpretiert die Shell dies als Zeilenfortsetzung. Das <backslash>und <newline>muss entfernt werden, bevor die Eingabe in Token aufgeteilt wird . Da das Escapezeichen <newline>vollständig aus der Eingabe entfernt und nicht durch Leerzeichen ersetzt wird, kann es nicht als Token-Trennzeichen verwendet werden.

Das Punktzeichen kann mit einem Alias ​​versehen werden:

$ alias .='echo hello'
$ .
hello

was bedeutet, dass \.die Verwendung der Alias-Version des .Befehls vermeiden würde , weil ,

Nachdem ein Token abgegrenzt wurde, aber bevor die grammatikalischen Regeln in der Shell-Grammatik angewendet werden, muss ein resultierendes Wort, das als das Befehlsnamenwort eines einfachen Befehls identifiziert wird, untersucht werden, um festzustellen, ob es sich um einen nicht zitierten , gültigen Aliasnamen handelt.

Kusalananda
quelle
Ich suchte nach einer offiziellen Quelle, wie Backslash in einem Wort als Zitat interpretiert wird und wie dies eine Alias-Erweiterung verhindert. Danke für den Hinweis!
Sheljohn
1
@Sheljohn Siehe aktualisierte Antwort.
Kusalananda