Як зняти мінус?


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 ...]

Я намагався втекти, цитувати і благати, але не можу зрозуміти, як зробити так, щоб командос Уналія очистив безлад.

(Я знаю, що перезапуск зробить трюк, але, безумовно, повинен бути інший спосіб)


13
Ха-ха, тепер я застряг і в моєму, працюючи над цим EDIT: Схоже, відповідь choroba працював на мене
асміт

9
Вигляд нагадує мене про старе echo > \\?\c:\windows\x., або про той час я rm -rf * ~випадково.
Jason 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

19
Хоча варто зазначити, що для файлів однаково допустимим методом є використання шляху до файлу, який уникає цього; тож ви можете використовувати ls ./-blaта rm ./-bla(або вказувати повний шлях, у будь-якому випадку простіше). Очевидно, що це не працює для псевдонімів!
Мюзер


93

Просто використовуйте той самий трюк, який ви використовували для встановлення псевдоніма

unalias whatever --color

9
працює справді, +1, але інше рішення трохи чистіше :)
Попросити

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

Псевдоніми в деяких сферах використання заплутані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.