83

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

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 убирать беспорядок.

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

3 ответа3

128

Вы можете избежать 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
94

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

unalias whatever --color
3

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

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

unalias grep --color


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

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

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

    --color=always
    grep=grep
    

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

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

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

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

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

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

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

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

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

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

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

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

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

    unalias whatever -a
    

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

В разделе BUGS man bash вы можете прочитать о нескольких вещах :-)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .