在 Linux 中运行命令时会发生什么?

大多数 Linux 用户通常不知道操作系统的内部工作。 你可能在 shell 上运行 Linux 命令很长时间了,但是你有没有想过当你点击的时候幕后发生了什么? Enter?

最后,您将对 Linux 中 shell 如何处理键入的命令有一个简要的了解。

处理命令

当您输入命令时,shell 所做的第一件事就是将整个命令分解为“标记”。 然后,shell 将查找属于命令行中第一个标记的程序名称。

如果在 $PATH 环境变量中定义的搜索路径中的任何目录中或在带有 . 运算符,或者它不是 shell 别名或 shell 函数,shell 将给出错误。 如果它确实找到了一个有效的命令,shell 将遍历每个其他标记并决定它是变量、shell 参数还是命令的参数。

如果 shell 确定它是一个变量或参数,如 ~ 主目录的操作符,shell 将扩展它们,或用命令中的原始值替换它们。

当 shell 扩展了任何参数或变量时,它会将命令字符串传递给命令,并使用其参数运行程序。 shell 不会确定任何参数是否有效。 那是指挥部的工作。

运行命令

当 shell 启动另一个命令时,它如何返回到您之前使用的相同提示? shell 会复制自己,这个过程称为分叉。 此 shell 副本将自身替换为命令,以及之前处理过的所有参数。 这称为“exec”,组合过程称为“fork-and-exec”。

例如,当您运行 ls 命令时,shell 进程将使用 叉子() 方法并创建另一个 shell 实例。 在系统上运行的两个 shell 进程中,附加的 shell 将使用 执行() 函数,将自身转换为 ls 命令的一个实例。

同时,原始 shell 等待命令完成。 这就是为什么您可以使用作业控制来暂停作业并让作业在 shell 的后台运行。

有关的: Linux 中的进程是什么?

报告 Exit 地位

Linux 命令通过退出状态报告它们是否成功运行。 顾名思义,程序在完成运行时报告其退出状态。 他们通过 $? 环境变量,其中包含上次运行命令的退出状态。

按照惯例,退出状态 0 表示执行成功,而 0 以外的任何值通常表示错误。 您的 shell 还可能在命令行上指示非零退出状态,具体取决于您的提示的配置方式。

上面的屏幕截图是一个显示自定义 Zsh 提示的示例,该提示显示由于命令不存在而导致的错误退出状态 127。

现在你知道 Linux 命令是如何工作的了

现在您已经了解了 Linux shell 如何处理命令、fork 和 execs 本身,以及程序如何报告它们的退出状态,您可以更有效地使用命令行。

用户可以免费使用几个 Linux shell。 虽然他们每个人都或多或少地执行相同的工作,但它们在许多方面都不同。 您可以尝试在您的系统上安装一些 shell,然后自己决定哪一个最适合您。