【问题标题】:how does shell run sh scripts?shell 如何运行 sh 脚本?
【发布时间】:2020-09-15 11:13:12
【问题描述】:

我们知道,每次用户通过向 shell 键入可执行目标文件的名称来运行程序时,shell 都会创建(使用 fork)一个新进程,然后加载(使用 execve)并运行在这个新进程的上下文中的可执行目标文件。

以下是我对 shell 内部工作原理的理解,如果我错了,请纠正我:

lscat等命令是可执行对象(C编写的源文件)在/bin/目录下。例如,当用户键入 bash shell ls 以列出文件和目录时,bash shell 解释 ls 命令并派生一个子进程以运行 ls

Q1-我的理解正确吗?

Q2-如果我的理解是正确的,那么当一个shell运行.sh脚本文件是:

#!/bin/sh
echo "what is your name?"
read name

所以shell为echoread分叉了两个子进程,那么这两个进程是如何相互通信的呢?我的意思是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 指向的位置;默认到你的终端。

标签: c linux shell process


【解决方案1】:

我的理解正确吗?

一般来说,是的。但可执行文件不一定在/bin/。在PATH 环境变量中指定的路径中搜索名为ls 的文件并使用匹配项。该文件可以在/usr/bin/usr/sbin/usr/local/bin等中。

ls 可能是内置的。或者一个函数。或别名。

所以 shell 为 echo 和 read 分叉了两个子进程

这就是“内置”的用武之地。内置是由外壳内部处理的外壳的内部部分。没有fork,只是运行了一些内部代码,这样它就可以修改环境变量。 echo 不一定是内置的,它只输出数据。但是read 必须进行特殊处理,并且很可能是一个内建函数,用于修改 name 变量(不需要内置 read,它可能不是,但通常 shell 编写者通过使 @ 987654333@ 内置)。

bash 上,您可以使用type 检查命令类型。前任。 type echo 显示echo is a shell builtin

我的意思是echo进程的返回输出如何传递给读取进程?

没有。

您可能想阅读posix Command Search and Execution

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2018-08-10
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多