![当用户在 shell 的内核位置插入命令时会发生什么?](https://linux22.com/image/154036/%E5%BD%93%E7%94%A8%E6%88%B7%E5%9C%A8%20shell%20%E7%9A%84%E5%86%85%E6%A0%B8%E4%BD%8D%E7%BD%AE%E6%8F%92%E5%85%A5%E5%91%BD%E4%BB%A4%E6%97%B6%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F%20.png)
在 Linux 中,用户在 shell 上插入命令,例如 bash 或 sh、csh 等。当用户在 shell 的内核位置插入命令时会发生什么?
当用户执行命令时系统调用是否执行?
如果用户插入像 vi /etc/passwd 这样的命令。 vi /etc/passwd 命令应传递给内核,内核将检查用户权限,如果用户具有 /etc/passwd 的权限,则返回文件内容或类似内容。
答案1
正如库萨拉南达指出的那样,这个问题非常棘手。有一些高层次的观点可能有助于理解我无法轻易地融入评论......
内核不直接负责处理 shell 中的命令。 shell 本身就是一个程序。 shell 将用户输入的文本解释为命令,然后根据这些命令执行任务。
了解 Linux 有几种不同的 shell 可用,包括 Bash、KSH 和 ZSH,这一点也很重要。因此,根据您使用的 shell,shell 使用的确切系统调用可能会略有不同。
一般来说,一些命令直接构建到 shell 中,但许多实际上是位于PATH
环境变量中列出的目录中的程序。这意味着对于许多命令来说,shell 采取的操作是执行另一个程序。它通过系统调用来做到这一点fork
然后exec
。
例子:
vi /etc/passwd
shell 不知道也不关心/etc/passwd
是什么。它只知道这vi
是一个程序( /usr/bin/vi
)。它使用 fork()、exec() 来执行 vi,并将文本“/etc/passwd”作为参数传递给 exec()。然后它调用wait
等待vi完成并获取返回值。
内核对“/etc/passwd”字符串不感兴趣。它被传递给 vi,然后 vi 将其解释为要打开的文件。 vi 负责调用open
打开文件,只有在这个阶段内核才会检查当前用户是否被允许打开该文件。
如前所述,所使用的确切系统调用差异很大,并且正如 Kusalananda 指出的那样,这个问题太波特了,无法列出 shell 完成的所有操作,但基本的 fork() exec() wait() 是运行任何程序时的常见模式。