Warum einen Shell-Befehl mit einem Backslash starten?

Antworten:

200
alias curl='curl --some --default --options'

Wenn Sie einen Alias ​​für haben curlund diesen nicht verwenden möchten, deaktiviert das Setzen eines Backslashs den Alias ​​und führt die Curl-Binärdatei direkt aus.

Beachten Sie, dass dies nur für eine interaktive Shell gilt. Aliase werden in Skripten nicht wirksam, daher wäre dies dort nicht erforderlich.

John Kugelman
quelle
4
Aliase können in Skripten verwendet werden, indem sie shopt -s expand_aliasesvor der Verwendung des Alias ​​verwendet werden
Alex
@lbaby Gleiche in Kornshell. Sie geben einen möglichen Befehlsalias frei, indem Sie einen Backslash davor setzen. Dies ist in Kornshell sehr häufig, wenn Benutzer Eingabeaufforderungen mit dem Namen des Verzeichnisses in ihnen definieren . Beachten Sie, dass die erste Zeile dieser Funktion "\ cd" $ @ "" lautet.
David W.
1
Es ist erwähnenswert, dass \curlkeine Shell- Funktion namens umgangen wird curl. Dafür können Sie den eingebauten Befehl bash verwenden command:command curl ...
Keith Thompson
7
Eine leichter zu verstehende Art zu schreiben \curl ...istcommand curl ...
Glenn Jackman
Beachten Sie, dass dash(und möglicherweise andere Muscheln, obwohl sie korrekt sind bashohne expand_aliases) nicht erweitern Aliase in Skripten.
Adrian Günter
163

Die Shell-Spezifikation (Bourne / POSIX) besagt, dass die Alias-Ersetzung in einer interaktiven Shell unterdrückt wird, wenn ein Zeichen des Befehlsworts in Anführungszeichen gesetzt wird. Ein Backslash ist eine Möglichkeit, dies zu tun, aber es gibt auch andere bekannte Möglichkeiten, Anführungszeichen zu setzen: einfache und doppelte Anführungszeichen. Alle folgenden Schritte unterdrücken die Aliasersetzung:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

Die Verwendung \curlist nur die gebräuchlichste und lesbarste Methode. Da dies eine standardisierte Funktion ist, können Sie davon ausgehen, dass sie in allen Bourne-Heritage-Shells funktioniert.

\curlsieht ein bisschen aus wie ein TeX-Befehl, nicht wahr? :-)

Jens
quelle
14
+1 für die Angabe des Grundes, warum gleichnamige \curlAliase umgangen werden; Beachten Sie, dass nur Aliase auf diese Weise umgangen werden, keine Shell-Funktionen . command curl ...würde sicherstellen, entweder zu umgehen .
mklement0
1
Ich sehe den Punkt des letzten Satzes nicht. Übrigens erwähnen Sie nur das Umgehen von Aliasen , aber jede Art von Zitieren umgeht auch Schlüsselwörter.
gniourf_gniourf
@ mklement0 Nicht ganz sicher ... command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"druckt Not command, lol!x 3.
Adrian Günter
3
@ AdrianGünter: Ja, wenn Sie command sich durch eine Shell-Funktion ersetzen , besiegen Sie den Mechanismus. Ihr Beispiel zeigt, dass Funktionen wie angegeben \ nicht umgangen werden . Ein nicht selbstzerstörerisches Beispiel : date() { echo 'not date'; }; date; command date. Wenn Sie besorgt sind über böswillige Manipulation mit command, siehe stackoverflow.com/a/35931876/45375
mklement0
@ mklement0 Ich verstehe das alles, aber mein Punkt ist, dass man sich auch nicht darauf verlassen kann, wenn man nicht garantieren kann, dass kein anderer Befehlsname als Funktion existiert (dh man hat keine Kontrolle über die Ausführungsumgebung) commandnicht überschrieben werden. Von Ihrem eigenen Link:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Adrian Günter