[英]how does shell run sh scripts?
我们知道,每次用户通过向 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
进程?
我的理解正确吗?
一般来说,是的。 但可执行文件不一定在/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.