当我编写 shell 脚本时,我碰巧知道command
是一个保留字。然后我注意到command
也是一个 bash 命令。
command ls
给出的结果与 相同ls
。command ls | grep xxx
其结果与没有它时相同。
那么我想知道当它是 bash 命令时它有什么用处。当它是 shell 脚本时它有什么用处。谢谢!
答案1
command foo
foo
即使定义了shell 函数,也会运行该命令foo
。此行为是POSIX 要求。
foo
它允许您在函数内部调用命令foo
。如果没有command foo
该函数(调用时)将调用自身并创建循环引用。
嗯,有时你可以foo
通过完整路径调用可执行文件来抑制 shell 函数查找(很麻烦而且不可移植,但某种解决方法),但在某些情况下你不能。例如在我的这个答案(接近尾声)我重新定义了“cd
必须command cd
”,因为即使有cd
可执行文件我可以使用哪个完整路径,它不会改变目录。command
使用正确的方式来解决这个问题。
还要注意command foo
不会触发foo
别名(如果有)。您用作ls
示例。至少有几个常见的 Linux 发行版默认将别名设置ls
为。在这种情况下,和可能会产生不同的结果(即有色或无色)。POSIX(或任何其他)的定义不需要提及别名,因为首先不会触发别名(如果有)(关于的可能例外很少,但不是其中之一)。ls --color=auto
ls
command ls
command
bar foo
foo
bar
command
无论您是command foo
在交互式 shell 会话中还是在 shell 脚本中使用都可能对 有影响foo
,但对内置命令本身却无关紧要command
。