进一步阅读

进一步阅读

于是我就想。尝试附加到$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命令,还有其他几个命令。它正在执行该命令,即使它echoPATH搜索中没有找到外部命令。

(请注意,有相当多的方法可以以echo不符合要求的方式调用,或者至少以结果未指定的方式调用:使用-n;在任何参数中使用反斜杠;使用-e;使用其他期望它们是命令选项或选项结束标记的东西。这些不仅可以揭示它是否是内置的echo,甚至在一定程度上揭示了正在使用的shell。幸运的是,你没有遇到其中任何一个。☺)

进一步阅读

相关内容