【发布时间】:2020-09-15 11:13:12
【问题描述】:
我们知道,每次用户通过向 shell 键入可执行目标文件的名称来运行程序时,shell 都会创建(使用 fork)一个新进程,然后加载(使用 execve)并运行在这个新进程的上下文中的可执行目标文件。
以下是我对 shell 内部工作原理的理解,如果我错了,请纠正我:
ls、cat等命令是可执行对象(C编写的源文件)在/bin/目录下。例如,当用户键入 bash shellls以列出文件和目录时,bash shell 解释ls命令并派生一个子进程以运行ls
Q1-我的理解正确吗?
Q2-如果我的理解是正确的,那么当一个shell运行.sh脚本文件是:
#!/bin/sh
echo "what is your name?"
read name
所以shell为echo和read分叉了两个子进程,那么这两个进程是如何相互通信的呢?我的意思是echo 进程的返回输出如何传递给read 进程?
【问题讨论】:
-
它没有。
echo运行并产生输出。然后 shell 尝试从输入流中读取一行。在许多情况下,输出被写入终端,而输入则从同一个终端读取。作为用户,当 shell 等待输入时,您会在终端上看到 echo 的输出。 -
@WilliamPursell OK,所以命令是可执行对象(C编写的源文件),对吗?
-
不一定。 C 源文件可用于生成可执行文件。并非所有命令都是可执行文件。
-
命令也可以是 shell 中的内置命令、别名、函数或 shell 脚本或其他脚本。
-
@amjad :当然取决于外壳。对于
ls,当您使用 (POSIX) shell 时,必须使用可执行文件,例如 bash 或 zsh 中的内部命令。read是 shell、bash 和 zsh 内部的一个内部命令,但当然您可以显式创建一个子 shell 以在单独的进程中运行它。由于您不使用管道,echo的标准输出将转到文件描述符 1 指向的位置;默认到你的终端。