繁体   English   中英

shell 如何运行 sh 脚本?

[英]how does shell run sh scripts?

我们知道,每次用户通过向 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进程?

我的理解正确吗?

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

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

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

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

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

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

它没有。

您可能想阅读posix 命令搜索和执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM