Jak odblokować minus?

83

Moja poranna kawa nie dotarła jeszcze do mojego mózgu, kiedy zapomniałem cytatów w:

alias grep="grep --color=always"

więc zamiast tego wpisałem:

alias grep=grep --color=always

pozostawiając mi:

--color=always
grep=grep

w moich pseudonimach.

Kiedy próbuję wyczyścić --color = zawsze używając unalias --color, otrzymuję:

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

Próbowałem uciekać, cytować i błagać, ale nie mogę wymyślić, jak sprawić, by komandos unalias posprzątał bałagan.

(Wiem, że restart wykona lewę, ale na pewno musi być inny sposób)

Wymagać
źródło
13
Ha ha, teraz utknąłem też w mojej, pracuję nad tym EDYCJA: Wygląda na to, że zadziałała dla mnie odpowiedź
choroby
9
Coś w rodzaju przypomina mi dawne echo > \\?\c:\windows\x., lub tym razem rm -rf * ~przez przypadek.
Jason C

Odpowiedzi:

127

Można uniknąć interpretacji myślników w poleceniach przez systemy zgodne z POSIX, dodając --przed wszelkimi argumentami.

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:~$

Działa to również z innymi narzędziami, powiedzmy, że masz plik o nazwie -bla. Jeśli spróbujesz go usunąć rm, pojawi się następujący błąd:

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.

Używając --przed nazwą pliku, usuniesz plik:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory
mtak
źródło
19
Chociaż warto zauważyć, że w przypadku plików równie prawidłową metodą jest użycie ścieżki do pliku, która tego unika; więc możesz użyć ls ./-blai rm ./-bla(lub określić pełne ścieżki, cokolwiek jest łatwiejsze w twoim przypadku). Oczywiście nie działa to jednak w przypadku aliasów!
Muzer
93

Po prostu użyj tej samej sztuczki, której użyłeś do ustawienia aliasu

unalias whatever --color
choroba
źródło
9
działa wprawdzie +1, ale inne rozwiązanie jest nieco czystsze :)
Wymagaj
1
Rzeczywiście, oczywiście :-)
choroba
unalias unalias --color
Cœur
3

Szybkie rozwiązanie

Aby naprawić oba nieprawidłowe aliasy, możesz po prostu uruchomić

unalias grep --color


Zrozumienie, co się stało

Podajesz niewłaściwe polecenie alias grep=grep --color=alwaysbez "...".

  • Ustawiasz dwa aliasy --color i grep; w rzeczy samej możesz to przeczytać po lewej stronie wyjścia (wszystko po lewej stronie =polecenia aliasu):

    --color=always
    grep=grep

    więc musisz usunąć oba.

  • Dlaczego tak się stało?
    W ...synoptyce aliasu oznacza, że ​​możliwe jest wielokrotne przypisanie w jednym wierszu:

    alias: alias [-p] [name [= wartość] ...]

    Na wyjściu help aliasmożesz odczytać synoptyczne, ale man bashmożesz odczytać, że jest możliwe w tej samej linii nawet do listy i przypisania w tym samym czasie:

    Po podaniu argumentów dla każdej nazwy, której wartość jest podana, definiowany jest alias. Końcowa spacja w wartości powoduje sprawdzenie następnego słowa pod kątem zastąpienia aliasu po rozwinięciu aliasu. Dla każdej nazwy na liście argumentów, dla której nie podano żadnej wartości, drukowana jest nazwa i wartość aliasu ...

  • Masz problemy z rozbrajaniem pierwszego --colorsamemu .
    To dlatego, że jest on interpretowany jako opcje dla aliasprzez powłokę; aby tego uniknąć, musisz powiadomić swoją bashpowłokę, że to, co następuje, nie jest opcją.

  • Holy Grail Linux:man w tym przypadku man bashjest to kaseton wypełnione skarbami przydatnych w sytuacji jak ta.
    Możesz czytać z man bash:

    - A - sygnalizuje koniec opcji i wyłącza dalsze przetwarzanie opcji. Wszelkie argumenty po - są traktowane jak nazwy plików i argumenty . Argument - jest równoważny z -.

    Jak podano w innej odpowiedzi, POSIX polega na użyciu kombinacji znaków specjalnych --.

    unalias -- --color
  • Ale dlaczego unalias grep --colordziała? Mam na myśli bez użycia --?
    Ponieważ działało aliasnawet dla unalias, możliwe jest nadanie więcej niż jednego nazwiska na raz (ponownie [...]).

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

    Mogę tylko zgadywać: dobrym nawykiem programistycznym jest pisanie procedur czytania i pisania w tym samym czasie, poniżej tej samej logiki. Tak musi być w przypadku procedur analizy opcji aliasi unalias.

    Że to działa, możesz zobaczyć nawet po tym poleceniu (z powłoki otwartej w tym celu), która nie usunie wszystkich twoich aliasów:

    unalias whatever -a

Uwaga końcowa

W sekcji BŁĘDY man bashpośród kilku zgłoszonych rzeczy, które możesz przeczytać:-)

Aliasy są mylące w niektórych zastosowaniach.

Hastur
źródło