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

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

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

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

Ответы:

127

Вы можете избежать 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
mtak
источник
19
Хотя стоит отметить, что для файлов одинаково допустимым методом является использование пути к файлу, который избегает этого; так что вы можете использовать ls ./-blaи rm ./-bla(или указать полные пути, что проще в вашем случае). Очевидно, что это не работает для псевдонимов, хотя!
Muzer
93

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

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

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

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

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среди немногих сообщений, о которых вы можете прочитать, вы можете прочитать:-)

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

Hastur
источник