bash如何执行命令

bash如何执行命令

这是我一直好奇的一个普遍问题,但简单地说:bash 如何执行通过脚本或终端给它的命令?

我想,有可能有一堆 if 语句检查所有命令,如下所示(伪代码):

if (command == "pwd") pwd();
else if (command == "echo") echo();
...

但这会产生问题,因为每次添加新命令时都必须重新编译代码,就像为 firefox 或 gedit 等程序启动的命令一样。

然后我想起了这个which命令,它(没有双关语)指向给定命令的目录,这让我假设 bash 只是查找一个文件并用 iostream 获取它来执行它。

是这样吗?如果是这样,它如何知道要调用什么方法,或者它们只是通用的可执行文件?

答案1

如果命令存在,内部是如何工作的:它只是使用普通的常规标准输入来存储命令(无论是否来自脚本)及其参数,然后解析它们,以便将它们发送到系统调用,就像execve这样在中找到命令然后系统运行它:

http://man7.org/linux/man-pages/man2/execve.2.html

此外,正如 Time4Tea 所说,有一些内置命令是您正在运行的 shell 所独有的。exit是其中之一。

 

根据经验,如果您无法通过任何常规方式了解有关 Linux 的某些内容,只需查找其源代码即可。

答案2

基本上,一些命令内置于 bash shell 程序本身(例如 echo、set),在这种情况下,bash 已经将代码编译到其中以在内部运行这些命令,以响应用户从命令行调用它们。如果您查看man bash或中的手册info bash,它有一个“内置函数”列表。

如果在内置命令中找不到命令,则 shell 会搜索 $PATH 环境变量中列出的目录(按列出的顺序),以查看是否可以在那里找到外部命令。如果没有,那么就会报找不到命令的错误。

相关内容