如何消除负号?


83

当我忘记以下内容中的引号时,我的早晨咖啡还没有触及:

alias grep="grep --color=always"

所以我改为输入:

alias grep=grep --color=always

给我留下:

--color=always
grep=grep

以我的别名。

当我尝试使用时清理--color = always时,unalias --color我得到:

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

我曾尝试过转义,引用和乞讨,但我不知道如何使突击队变得更加混乱。

(我知道重新启动将解决问题,但是肯定必须有另一种方法)


13
哈哈,现在我也将它卡在我的卡纸上,继续进行编辑:看起来choroba的答案对我
有用-asmith

9
有点让我想起旧的echo > \\?\c:\windows\x.,或者那个时候我rm -rf * ~偶然。
杰森C

Answers:


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 ./-blarm ./-bla(或指定完整路径,以您情况为准)。显然,这对别名不起作用!
Muzer's


93

只需使用与设置别名相同的技巧即可

unalias whatever --color

9
确实可以工作,但+1可以解决,但其他解决方案
则更

1
实际上,的确是:-)
choroba

unalias unalias --color
心教堂

3

快速解决方案

要修复这两个错误的别名,您可以简单地运行

unalias grep --color


了解发生了什么

alias grep=grep --color=always不输入错误命令"..."

  • 您设置了两个别名 --colorgrep;实际上,您可以在输出的左侧读取它(的所有左侧=都是一个别名命令):

    --color=always
    grep=grep

    因此您需要同时取消设置。

  • 为什么会这样?
    ...别名的天气意味着是可以做到的多个分配在一行:

    别名:别名[-p] [名称[=值] ...]

    在输出中,help alias您可以阅读摘要,但man bash即使在同一时间列出和分配,也可以在同一行中阅读:

    提供参数时,将为每个提供其值的名称定义一个别名。 当别名被扩展时,值中的尾随空格将导致检查下一个单词以替换别名。 对于参数列表中没有提供值的每个名称,将打印别名的名称和值...

  • 您有问题无法--color单独设置第一个
    这是因为它被解释为选项alias你的shell; 为了避免这种情况,您需要与您的bashShell 沟通,这不是选择。

  • 圣杯的Linux:man在这种情况下,man bash这是一个充满在这样情况下有用的珍品库房。
    您可以阅读man bash

    -A-表示选项结束,并禁用进一步的选项处理。 -后面的任何参数均被视为文件名和参数。-的参数等效于-。

    如其他答案中所述,POSIX方法是使用特殊字符组合--

    unalias -- --color
  • 但是为什么unalias grep --color要工作呢?我的意思是不使用--
    由于它alias甚至可以工作,unalias因此可以一次给出多个名称(再次[...])。

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

    我只能猜测一下:一个好的编程习惯是在相同的逻辑下同时编写读写例程。所以它必须是对的选项解析程序aliasunalias

    即使从以下命令(从为此目的打开的外壳程序)中也可以看到此方法不会删除您的所有别名:

    unalias whatever -a

最后的话

man bash报告的几件事情的“错误” 部分中,您可能会阅读:-)

别名在某些用途中令人困惑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.