我正在运行一个称为hello
bash的简单可执行文件。它查询用户的输入并打印出响应。我这样运行./hello
。
提示和用户键入他的响应都在当前外壳中进行,但我认为它应该在其他外壳中运行。我以为是因为您可以使用source在当前shell中运行exe。
谁能向我解释这是如何工作的?
在尝试对此进行研究时,我经常遇到术语“外壳环境”和“外壳上下文”。它们是一样的吗?
您可能会说出有关当前外壳环境的“外壳环境”,其中包括当前环境变量。该环境由任何已启动的子进程(subshell或其他)继承。
“外壳上下文”是一个不常用的术语,但是我假设它与“过程上下文”等效。对于shell脚本,这将包括shell环境以及当前的shell变量,文件描述符(标准输入,标准输出和标准错误,以及其他任何显式打开的),信号处理程序(随一起安装trap
)等。这是一个C程序,流程上下文将在对的调用中继承fork()
,但不会在后续exec()
调用中继承(只有环境可以在调用后保留下来exec()
)。
当您运行hello
程序时(我假设它是一个Shell脚本),输入和输出发生在正在执行该hello
脚本的Shell的上下文中。这是“当前外壳”。您键入的外壳./hello
是其父外壳,并hello
继承其环境。
在内部,父外壳执行afork()
并exec()
调用以启动将最终运行hello
脚本的外壳。
hello
脚本在与启动脚本的位置相同的终端中进行提示的事实仅表示,运行该脚本的外壳程序是该脚本程序所在的当前前台进程。父外壳正在等待它完成。完成后,父外壳将再次成为终端中的前台进程。
当使用source ./hello
或启动脚本时. ./hello
,脚本将在与您键入该命令的shell相同的上下文中执行。这意味着它可能会修改交互式外壳的上下文和环境。例如,它可以更改当前工作目录(更改环境)或安装信号处理程序(更改上下文),并且当脚本完成执行时,这些更改仍将是“活动的”。
如果hello
程序是已编译的二进制文件,则它将继承调用外壳程序的环境,但不会共享其上下文(文件描述符等)。由于它不是shell脚本,因此它实际上并没有在subshell中运行。父外壳程序将移入后台,等待程序完成,就像它对外壳程序脚本所做的一样。从父shell的角度来看,启动已编译的二进制文件或shell脚本之间没有区别。
编译后的二进制文件可能不能以source
或.
(点)开头,因为外壳程序不知道如何解释二进制文件。
这个答案有点挥手,但我相信这基本上是正确的。如果需要更正或添加任何内容,请发表评论(或编辑)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句