当我早晨的咖啡还没有进入我的大脑时,我就忘记了下面的引文:
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 ...]
我尝试过逃避、引用和乞求,但我无法弄清楚如何让突击队清理混乱局面。
(我知道重新启动可以解决问题,但肯定还有其他方法)
答案1
--
您可以通过在任何参数前添加破折号来避免 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
答案2
只需使用与设置别名相同的技巧即可
unalias whatever --color
答案3
快速解决方案
修理两个都你可能只是运行错误的别名
unalias grep --color
了解发生了什么
alias grep=grep --color=always
您没有给出 错误的命令"..."
。
你设置了两个别名
--color
和grep
;实际上您可以在输出的左侧读到它(左侧的所有内容=
都是别名命令):--color=always grep=grep
所以您需要取消两者的设置。
为什么会发生这样的事?
别名的概要...
意味着可以在一行中进行多次赋值:别名:别名 [-p] [名称[=值] ... ]
在输出中,
help alias
您可以读到概要,但从中man bash
您可以读到,甚至可以在同一行中同时列出和分配:当提供参数时,为每个给定值的名称定义一个别名。 值中的尾随空格会导致在别名扩展时检查下一个单词是否进行别名替换。 对于参数列表中每个未提供值的名称,将打印别名的名称和值...
--color
您在单独取消设置第一个时遇到问题.
这是因为它被解释为选项由你的 shell来alias
执行;为了避免这种情况,你需要向你的bash
shell 传达以下信息不是一种选择。这圣杯Linux 的:
man
,在这种情况下,man bash
这是一个装满财宝的保险箱,在这种情况下很有用。
您可以阅读man bash
:-- A -- 表示选项的结束并禁用进一步的选项处理。 -- 之后的任何参数都被视为文件名和参数. 参数 - 相当于 --。
正如其他答案所述,POSIX 方式是使用特殊字符组合
--
。unalias -- --color
但为什么
unalias grep --color
是工作?我的意思是无需使用--
? ,
因为它alias
甚至unalias
可以在一次提供多个名称(再次[...]
)。unalias: unalias [-a] name [name ...]
我只能给出我的猜测:一个好的编程习惯是同时编写读取和写入例程,并遵循相同的逻辑。因此,对于
alias
和的选项解析例程来说,也必须如此unalias
。您甚至可以从这个命令(从为此目的打开的 shell 中)看到这个方法是有效的,它不会删除您的所有别名:
unalias whatever -a
结束语
man bash
在报告的少数问题中的 BUGS 部分,您可能会读到:-)
别名在某些用途上容易引起混淆。