了解如何使用Bash脚本正确运行子壳

如何指导子壳在后台并行运行

shell是在Linux系统上输入命令的基本界面。 有了它,您可以直接输入命令或指定一个包含要执行的命令序列的文件(脚本)。 shell按层次结构组织,任何shell都可以创建一个新的shell。 新的shell被认为是创建它的父shell的子进程 - 子shell。

默认情况下,如果父进程终止,则子shell依赖于其父进程,子进程也会终止。 任何输出都从subshel​​l传递到父shell。

如何创建一个子壳

在Bash shell脚本中,使用括号表示法创建子shell:

#!/ bin / bash echo“开始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)echo“Finished”

在该示例中, while循环包含在括号中,这会导致它在执行脚本文件的shell的子shell中执行。

在后台运行子壳

除非您指定要在后台执行子shell,否则在继续执行脚本的其余部分之前,父shell会等待子shell完成。 但是,如果要并行运行子壳,则可以在后台运行它们,这是通过subshel​​l表达式后面的&符号来完成的,如下所示:

#!/ bin / bash echo“开始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&echo“Finished”

并行运行多个子壳

如果您创建多个子壳体作为后台进程 ,则可以并行运行任务。 通常,操作系统为每个进程和子进程使用不同的处理器或内核,假定至少有与处理器一样多的处理器或内核。 否则,任务将分配给相同的处理器或内核。 在这种情况下,处理器或内核会在指定的任务之间不断切换,直到任务完成。 下一个例子有两个子过程。 第一个从1到99,第二个从1000到1099。

#!/ bin / bash echo“开始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&(count = 1000 while [$ count -le 1099] do echo“$ count”sleep 1((count ++))done)&echo“Finished”

使用wait语句告诉父进程等待子进程完成,然后继续执行脚本的其余部分:

#!/ bin / bash echo“开始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&(count = 1000 while [$ count -le 1099] do echo“$ count”sleep 1((count ++))done)&wait echo“Finished”

用于Subshel​​ls

当需要在特定的环境或目录中执行命令时,子壳很有用。 如果每个命令都在不同的子shell中执行,则不存在变量设置混淆的风险。 完成后,设置和当前目录不需要恢复,因为父进程的环境不受其任何子进程的影响。

子函数可以在函数定义中使用,以便它们可以用不同的参数多次执行。