于是我就想。尝试附加到$PATH
。哎呀!我不小心取消了设置$PATH
!不知为何我运行了
$ ls
bash: ls: command not found
意料之中。然后我跑了
$ echo $PATH
$PATH:/home/jon/.local/bin
是echo
某种特殊情况吗?为什么不打开$PATH
?它是内置于 bash 中的吗?
答案1
echo
是 bash 的内置程序。它不使用 来$PATH
查找echo
程序,而是使用 bash 自己的版本echo
来代替echo
位于您的$PATH
更多详情请阅读: Bash 内置函数(Bash 参考手册)
答案2
除了 Minijack 提到的之外,您还可以使用type
内置命令来检查命令是什么。
$ type echo
echo is a shell builtin
另一方面,which
可以专门用于检查可执行文件。一旦取消设置 $PATH,您将得到类似
$ which echo
/usr/bin/which: no echo in ((null))
而当你设定好路径后,你就会得到
/usr/bin/echo
您可以查看man builtins
各种内置命令的列表和描述。例如,[
和test
也是内置命令。
编辑:which
即使没有 PATH 也可以为我工作,因为别名使用了绝对路径
答案3
采用的模型单一 Unix 规范(又名 IEEE 1003.1)的一项规定是,命令是否内置于 shell 中只是一种优化,并且命令的内置版本和外部版本的行为(如果以符合要求的方式调用)应该相同。(这是常规的内置命令,即。特殊内置命令是另一回事。)特别是,如果在搜索中未找到外部命令PATH
,则不会执行内置版本。
这确实是发生在一个壳上的情况。你会发现渡边壳符合不锈钢在其posixly-correct
模式下,如果不在路径上,则 Watanabe shell 中的echo
内置命令将不会被执行。echo
但是 93 Korn、Debian Almquist、Z 和 Bourne Again shell 在最符合规范的模式下仍然执行内置命令即使上没有相应的可执行文件PATH
。这就是您在这里遇到的情况。Bourne Again shell 有一个内置echo
命令,还有其他几个命令。它正在执行该命令,即使它echo
在PATH
搜索中没有找到外部命令。
(请注意,有相当多的方法可以以echo
不符合要求的方式调用,或者至少以结果未指定的方式调用:使用-n
;在任何参数中使用反斜杠;使用-e
;使用其他期望它们是命令选项或选项结束标记的东西。这些不仅可以揭示它是否是内置的echo
,甚至在一定程度上揭示了正在使用的shell。幸运的是,你没有遇到其中任何一个。☺)
进一步阅读
- https://unix.stackexchange.com/a/496377/5132
- https://unix.stackexchange.com/a/496291/5132
- “命令搜索和执行“。 Shell 命令语言. IEEE Std 1003.1-2017。开放群组。
echo
。 实用工具. IEEE Std 1003.1-2017。开放群组。- “为什么
printf
比 更好echo
?“