Wie kann ich ein Minuszeichen entfernen?

83

Mein Morgenkaffee hatte mein Gehirn noch nicht erreicht, als ich die Anführungszeichen in vergaß:

alias grep="grep --color=always"

Also schrieb ich stattdessen:

alias grep=grep --color=always

Lass mich mit:

--color=always
grep=grep

in meinen Pseudonymen.

Wenn ich versuche, die --color = always using aufzuräumen, erhalte unalias --colorich:

bash: unalias: --: invalid option
unalias: usage: unalias [-a] name [name ...]

Ich habe versucht zu fliehen, zu zitieren und zu betteln, aber ich kann nicht herausfinden, wie ich mit dem Kommando-Unalias das Chaos beseitigen kann.

(Ich weiß, ein Neustart reicht aus, aber es muss doch einen anderen Weg geben.)

Requist
quelle
13
Ha ha, jetzt habe ich es in meinem stecken auch, auf sie EDIT arbeiten: Sieht aus wie die Antwort von choroba für mich gearbeitet
asmith
9
Erinnert mich irgendwie an die alte echo > \\?\c:\windows\x.oder die Zeit, als ich rm -rf * ~versehentlich war.
Jason C

Antworten:

127

Sie können verhindern, dass POSIX-kompatible Systeme Bindestriche in Befehlen interpretieren, indem Sie --vor Argumenten weitere hinzufügen .

mtak@frisbee:~$ alias grep=grep --color=always
mtak@frisbee:~$ alias | grep color
alias --color='always'

mtak@frisbee:~$ unalias -- --color
mtak@frisbee:~$ alias | grep color
mtak@frisbee:~$

Dies funktioniert auch mit anderen Dienstprogrammen. Nehmen wir an, Sie haben eine Datei mit dem Namen -bla. Wenn Sie versuchen, es mit zu entfernen, rmwird der folgende Fehler angezeigt:

mtak@frisbee:~$ ls -- -bla
-bla
mtak@frisbee:~$ rm -bla
rm: invalid option -- 'b'
Try 'rm ./-bla' to remove the file '-bla'.
Try 'rm --help' for more information.

Indem Sie --vor dem Dateinamen verwenden, entfernen Sie die Datei:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory
mtak
quelle
19
Obwohl es erwähnenswert ist, dass für Dateien eine ebenso gültige Methode darin besteht, einen Pfad zu der Datei zu verwenden, der dies vermeidet. Sie können also ls ./-blaund verwenden rm ./-bla(oder die vollständigen Pfade angeben, was in Ihrem Fall einfacher ist). Offensichtlich funktioniert dies jedoch nicht für Aliase!
Muzer
93

Verwenden Sie einfach denselben Trick, den Sie zum Festlegen des Alias ​​verwendet haben

unalias whatever --color
Choroba
quelle
9
funktioniert in der Tat, +1, aber die andere Lösung ist ein bisschen sauberer :)
Requist
1
In der Tat natürlich :-)
Choroba
unalias unalias --color
Cœur
3

Schnelle Lösung

Um die beiden falschen Aliase zu beheben , können Sie einfach ausführen

unalias grep --color


Verstehen, was passiert ist

Sie geben den falschen Befehl alias grep=grep --color=alwaysohne "...".

  • Sie setzen zwei Aliase --color und grep; in der Tat können Sie es auf der linken Seite Ihrer Ausgabe lesen (alles links von =ist ein Alias-Befehl):

    --color=always
    grep=grep

    Sie müssen also beide deaktivieren.

  • Warum ist das passiert?
    Das ...in der Synoptik von Alias ​​bedeutet, dass mehrere Zuweisungen in einer Zeile möglich sind:

    alias: alias [-p] [name [= wert] ...]

    In der Ausgabe von help aliaskönnen Sie die man bashÜbersicht lesen, aber von Ihnen können Sie lesen, dass es möglich ist, in derselben Zeile sogar gleichzeitig aufzulisten und zuzuweisen:

    Bei der Angabe von Argumenten wird für jeden Namen, dessen Wert angegeben wird, ein Alias ​​definiert. Ein Leerzeichen nach dem Wert bewirkt, dass das nächste Wort auf Alias-Ersetzung überprüft wird, wenn der Alias ​​erweitert wird. Für jeden Namen in der Argumentliste, für den kein Wert angegeben ist, werden Name und Wert des Alias ​​gedruckt ...

  • Sie haben Probleme, die erste Einstellung --coloralleine zu deaktivieren .
    Dies , weil sie als Optionen interpretiert für aliasvon Shell; Um dies zu vermeiden, müssen Sie Ihrer bashShell mitteilen, dass das, was darauf folgt, keine Option ist.

  • Der Heilige Gral von Linux:man In diesem Fall man bashhandelt es sich um eine Truhe voller Schätze, die in einer solchen Situation nützlich sind.
    Sie können lesen von man bash:

    - A - signalisiert das Ende von Optionen und deaktiviert die weitere Optionsverarbeitung. Alle Argumente nach dem - werden als Dateinamen und Argumente behandelt . Ein Argument von - entspricht -.

    Wie in einer anderen Antwort angegeben, besteht die POSIX-Methode darin, die Sonderzeichenkombination zu verwenden --.

    unalias -- --color
  • Aber warum unalias grep --colorarbeitet? Ich meine ohne zu benutzen --?
    Da es aliasauch für funktionierte unalias, ist es möglich, mehr als einen Namen auf einmal zu vergeben (wieder der [...]).

    unalias: unalias [-a] name [name ...]

    Ich kann nur raten: Eine gute Programmiergewohnheit besteht darin, die Lese- und Schreibroutinen gleichzeitig unter der gleichen Logik zu schreiben. Also muss es für die Option Parsing-Routinen von aliasund sein unalias.

    Dass dies funktioniert, können Sie auch an diesem Befehl (in einer zu diesem Zweck geöffneten Shell) erkennen, mit dem nicht alle Ihre Aliase gelöscht werden:

    unalias whatever -a

Letzte Bemerkung

man bashUnter den wenigen Dingen, über die Sie berichtet haben, finden Sie im Abschnitt BUGS eine Liste:-)

Aliase sind bei einigen Verwendungen verwirrend.

Hastur
quelle