Как сделать минус?

5317
Requist

Мой утренний кофе еще не дошел до мозга, когда я забыл цитаты:

alias grep="grep --color=always" 

поэтому вместо этого я напечатал:

alias grep=grep --color=always 

оставив меня с:

--color=always grep=grep 

в моих псевдонимах.

Когда я пытаюсь очистить --color = всегда используя, unalias --colorя получаю:

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

Я пытался сбежать, цитировать и просить, но не могу понять, как заставить коммандос unalias убирать беспорядок.

(Я знаю, что перезапуск поможет, но наверняка должен быть другой путь)

83
Ха-ха, теперь я тоже застрял в нем, работая над ним. РЕДАКТИРОВАТЬ: похоже, ответ Чоробы на меня asmith 7 лет назад 13
Что-то напоминает мне о старом `echo> \\? \ C: \ windows \ x`, или о том, что я случайно` rm -rf * ~ `. Jason C 7 лет назад 9

3 ответа на вопрос

128
mtak

Вы можете избежать POSIX-совместимых систем, интерпретирующих тире в командах, добавляя --перед любыми аргументами.

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

Это также работает с другими утилитами, скажем, у вас есть файл с именем -bla. Если вы попытаетесь удалить его вместе с rmвами, вы получите следующую ошибку:

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. 

Используя --перед именем файла, вы удалите файл:

mtak@frisbee:~$ rm -- -bla mtak@frisbee:~$ ls -- -bla ls: cannot access '-bla': No such file or directory 
Хотя стоит отметить, что для файлов одинаково допустимым методом является использование пути к файлу, который избегает этого; так что вы можете использовать `ls ./- bla` и` rm ./- bla` (или указать полный путь, что проще в вашем случае). Очевидно, что это не работает для псевдонимов, хотя! Muzer 7 лет назад 19
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html Положение 10 DarkHeart 7 лет назад 1
94
choroba

Просто используйте тот же трюк, который вы использовали, чтобы установить псевдоним

unalias whatever --color 
работает действительно, +1, но другое решение немного чище :) Requist 7 лет назад 9
Действительно, конечно :-) choroba 7 лет назад 1
`unalias unalias --color` Cœur 7 лет назад 0
3
Hastur

Быстрое решение

Чтобы исправить оба неправильных псевдонима, вы можете просто запустить

unalias grep --color 


Понимание того, что случилось

Вы даете неправильную команду alias grep=grep --color=alwaysбез "...".

  • Вы устанавливаете два псевдонима --color и grep; на самом деле вы можете прочитать его в левой части вашего вывода (все слева от команды =с псевдонимами):

    --color=always grep=grep 

    так что вам нужно сбросить оба.

  • Почему это случилось? В синоптических псевдонимов означает, что можно сделать несколько ассигнование в одной строке:
    ...

    псевдоним: псевдоним [-p] [имя [= значение] ...]

    В выводе help aliasвы можете прочитать синоптик, но из man bashвы можете прочитать, что можно в одной строке даже перечислить и назначить одновременно:

    Когда предоставляются аргументы, псевдоним определяется для каждого имени, значение которого задано. Завершающий пробел в значении вызывает проверку следующего слова на предмет замены псевдонима при раскрытии псевдонима. Для каждого имени в списке аргументов, для которого не указано значение, выводятся имя и значение псевдонима ...

  • У вас есть проблемы, чтобы сбросить первый в --colorодиночку .
    Это потому, что оно интерпретируется как варианты для aliasвашей оболочки; чтобы избежать этого, вам нужно сообщить вашей bashоболочке, что то, что следует за ней, не вариант.

  • Святой Грааль в Linux:man в этом случае, man bashчто является кессона заполнены сокровищами полезных в подобной ситуации.
    Вы можете прочитать из man bash:

    - A - сигнализирует об окончании опций и отключает дальнейшую обработку опций. Любые аргументы после - обрабатываются как имена файлов и аргументы . Аргумент - эквивалентен -.

    Как сообщается в другом ответе, POSIX способ заключается в использовании комбинации специальных символов --.

    unalias -- --color 
  • Но почему unalias grep --colorработает? Я имею в виду без использования --?
    Так как он работал aliasдаже для unaliasодного человека, можно дать более одного имени за один раз (опять же [...]).

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

    Я могу только догадываться: хорошая привычка программирования - писать процедуры чтения и записи одновременно, по той же логике. Так должно быть для опций парсинга опций aliasи unalias.

    То, что это работает, вы можете увидеть даже из этой команды (из оболочки, открытой для этой цели), которая не удалит все ваши псевдонимы:

    unalias whatever -a 

Последнее замечание

В разделе «ОШИБКИ» man bashсреди немногих сообщений, которые вы можете прочитать, вы можете прочитать:-)

Псевдонимы в некоторых случаях сбивают с толку.