对于传递给exec()的shell脚本中的每个命令,它是否在子进程中生成并运行?假设我有一个名为test.sh的shell脚本,其中包含以下内容;
#!/bin/bash
echo Hello
echo There
如果我要在C程序中的test.sh上调用execvp(),我想知道如何处理一系列命令。
对于脚本中的每个命令,在返回到父级并重复执行下一个命令之前,在该命令上是否有一个派生后跟另一个exec调用?
到目前为止,我已经在这个确切的示例上使用了strace。我的发现是,如果我在脚本中添加了两个回显,就不会调用clone()(我相信这相当于分叉吗?),但是如果我这样放置两只单独的猫:
#!/bin/bash cat file1 cat file2
然后,我在strace中找到两个要克隆的调用。同时,单独跟踪单个cat调用,而不从shell脚本上的execvp调用运行它,不会在strace中产生任何克隆。
我真的很感谢澄清exec调用处理外壳程序脚本的方式。
对于传递给exec()的shell脚本中的每个命令,它是否在子进程中生成并运行?假设我有一个名为test.sh的shell脚本,其中包含以下内容; #!/ bin / bash echo您好echo有...
bash shell具有许多内置命令
一些命令内置在外壳中,因此它们不需要派生。必须内置实现控制流的所有命令(例如if
,while
,case
)。更改Shell进程状态的命令也必须内置,例如cd
和ulimit
。