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

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

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

处理命令

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

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

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

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

运行命令

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

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

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

报告 Exit 地位

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

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

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

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

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

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