Führen Sie einen Befehl aus, der von einem Alias ​​gespiegelt wird

163

Nehmen wir an, ich habe den folgenden Alias ​​in bash - alias ls='ls --color=auto'- und ich möchte normal lsohne Optionen aufrufen . Ist die einzige Möglichkeit, dies zu tun, das Unalias, das Kommando und dann das Alias ​​erneut auszuführen? Oder gibt es einen raffinierten Trick oder eine Problemumgehung?

Mirzhan Irkegulov
quelle
2
Nur ein Hinweis zu einigen der folgenden Antworten: "Befehl" ist der EINZIGE sichere Weg, um dies zu erreichen. Zum Beispiel das "." oder "Quelle" eingebaut, kann durch eine skriptdefinierte Funktion überschrieben werden. "Befehl ." oder "Befehlsquelle" ist die einzige Möglichkeit, Quelle sicher auszuführen, ohne dass stattdessen die skriptdefinierte Funktion aufgerufen wird. Keine der anderen Alternativen, einschließlich der Backslash-Methode "\.", Funktioniert, und natürlich gibt es keine Alternative "/ bin / source", die Sie durch Angabe eines vollständigen Pfads aufrufen können.
Dejay Clayton

Antworten:

209

Sie können auch einen umgekehrten Schrägstrich voranstellen, um den Alias ​​zu deaktivieren: \ls

Bearbeiten: Andere Möglichkeiten, dasselbe zu tun, umfassen:

Verwenden Sie "Befehl": command lsgemäß Mikel .

Verwenden Sie den vollständigen Pfad: /bin/lswie oben angegeben .

Zitiere den Befehl: "ls"oder 'ls'laut Mikel Kommentar.

Sie können den Alias ​​für diese Terminalsitzung vorübergehend mit entfernen unalias command_name.

Not Now
quelle
Dies ist meine Standardmethode.
ncmathsadist
sehr schön, funktioniert auch gut mit tcsh
Levon
10
Dieser Weg ist sehr nützlich. Es werden nur Aliase umgangen, keine Funktionen, wodurch es sich von commandoder unterscheidet builtin.
Mikel
1
Es scheint so, als ob l\ses dasselbe tut. Ist dieses Verhalten ein Fehler oder eine Funktion?
Niklas B.
4
Es ist ein "Feature". Nur nicht zitierte Aliase werden erweitert. Sie können es also in Anführungszeichen setzen oder einen Backslash verwenden, wo immer Sie möchten. Siehe Bash-Aliase-Referenz .
Mikel
79

Dafür ist der commandBefehl da.

Versuchen

command ls

Dadurch wird die Shell angewiesen, Aliase und Funktionen zu umgehen.

Dieser Weg wird von bash , zsh und ash / dash unterstützt.

Mikel
quelle
2
Beste Antwort, warum ist es aber nicht das am meisten verärgerte? :) +1
0xC0000022L
11
Weil es die 8-fache Anzahl von Zeichen als die Backslash- Methode
hinzufügt
1
@STATUS_ACCESS_DENIED Dies funktioniert auch nicht mit tcsh (und daher vermutlich auch nicht mit csh). Die "\" -Methode macht es
Levon
3
Die Backslash-Funktion ist nicht sicher. Es bietet zwar Schutz vor Aliasnamen mit ähnlichen Namen, jedoch keinen Schutz vor Funktionen mit ähnlichen Namen.
Dejay Clayton
2
@JoelFan Ich hätte lieber die wenigen zusätzlichen Zeichen und möchte, dass meine Skripte einfach zu befolgen sind und für alle funktionieren. Anstatt eines kryptischen Schrägstrichs, der nicht intuitiv ist, leicht zu übersehen ist, nicht gut dokumentiert ist und nicht für das Umgehen von Funktionen funktioniert.
Dennis
19

Der Alias ​​ist nur eine definierte Verknüpfung. In diesem Beispiel ist der definierte Alias ​​die Zeichenfolge ls, die ausgeführt wird ls --color=auto. Wenn Sie dieses Verhalten nicht möchten, können Sie die Binärdatei lsüber den absoluten Pfad aufrufen .

Das Ausführen von just /bin/lsführt zu einer Ausgabe ohne Farbe, da es sich nicht um den von Ihnen definierten Alias ​​handelt.

Sie können den Alias ​​auch in einen anderen ändern oder einen neuen Alias ​​hinzufügen, der nur lsohne die Farbparameter ausgeführt wird.

George M
quelle
2
Sie müssen wissen, wo sich der Befehl befindet. Bei einigen Systemen ist die Aufteilung zwischen /binund /usr/binbeliebig.
Keith Thompson
Dafür @KeithThompson, könnten Sie whichfür einige Befehle: which ls.
cst1992
@ cst1992: Wenn Sie which(oder type) verwenden, wird eine Suche über durchgeführt $PATH. Sie können auch einfach den Pfad verwenden lsoder \lsnicht angeben.
Keith Thompson
10

Eine andere Möglichkeit, auf der Antwort von @ uther aufzubauen, besteht darin , den Pfad der ausführbaren Datei mithilfe von $(which ...)oder `which ...`(mithilfe von Backticks ``) automatisch zu ermitteln. Dies funktioniert in bash:

$(which ls)

`which ls`

Zweifellos ist das einfache Präfixieren des Befehls mit a \viel kürzer.

UPDATE : Entsprechend, wie `which` in einem Alias-Befehl verwendet wird? Dies scheint überhaupt nicht zuverlässig zu sein.

krlmlr
quelle
Wofür sind die Klammern? Ich denke, Sie wollen `which ls`die Binärdatei direkt ausführen.
Amyassin
2
@amyassin: Beide Syntaxen sind äquivalent. (Übrigens, wie haben Sie die Backticks in die Code-Formatierung bekommen?)
krlmlr
Eigentlich hat das (which ls)bei mir nicht geklappt (auf Ubuntu 12.04 LTS) und die Backticks waren hart, ich bin ihnen einfach entkommen: \ `welche ls \`. Es hat eine Menge Bearbeitung
gekostet
1
@ user946850 "Um ein Backtick-Zeichen in einen Codebereich einzufügen, können Sie mehrere Backticks als öffnende und schließende Begrenzer verwenden." Quelle: Abschriftenreferenz .
Mikel
@amyassin: Hast du das hinzugefügt $?
krlmlr
2

Persönlich vermeide ich nur, Aliase mit denselben Namen wie Befehle zu definieren, rufe also lsimmer den tatsächlichen Befehl auf. Ich habe Aliase oder Funktionen für verschiedene Kombinationen von Optionen wie l, llund lg. (Das heißt, ich brauche unalias lsin meinem .bashrcoder .cshrc.)

Ich stelle fest, dass die Annahmen des Betriebssystems, welche Optionen ich bevorzugen könnte (die Annahmen der Designer des lsBefehls selbst überschreiben ), selten meinem persönlichen Geschmack entsprechen. Ich mag das Aussehen von nicht ls --color=autound seine Lesbarkeit kann zwischen Schwarz auf Weiß und Weiß auf Schwarz stark variieren.

YMMV und die anderen Lösungen sind natürlich noch gut zu wissen.

Keith Thompson
quelle
1

Die Eingabe des Befehls in Großbuchstaben scheint zu funktionieren LS, obwohl ich mir nicht sicher bin, warum.

Asmeurer
quelle
4
In welcher Shell, welchem ​​Betriebssystem, welchem ​​Terminal etc.?
Mikel
@Mikel Es gibt ein Paket "sl", das "sl" als "ls" liefert. Die Tips-Bash in Ubuntu besagen auch, dass "LS" von "sl" bereitgestellt wird.
Izkata
1
Dies ist Bash 4 (mit Fink installiert) in Mac OS X 10.7. Es funktioniert auch mit anderen Befehlen, die ich als Alias ​​verwendet habe, wie rm und grep.
Asmeurer
3
Es ist nur ein Witz :) von der LS - display animations aimed to correct users who accidentally enter LS instead of ls.
Mn-
7
Ich denke, dass dies für Mac OS X funktioniert, da das Dateisystem standardmäßig die Groß- und Kleinschreibung nicht berücksichtigt. Bei anderen Unixen funktioniert es nicht.
Jander,