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)


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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.