如何创建子shell

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

#!/bin/bash
# subshell-example.sh with endless loop
(
while [ 1 ] 
do
 echo "Subshell running . . ."
done
)

在示例中,while 循环被括在括号中,这使得它在执行脚本文件的 shell 的子 shell 中执行。

如何在 Bash 脚本中运行 Subshell

子shell 的用途

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

子shell 使用函数定义,可以使用不同的参数多次执行。

如何指示子shell在后台并行运行

shell 是在 Linux 系统上输入命令的基本界面。

有了它,我们可以直接输入命令或者指定包含要执行的命令序列的文件(脚本)。
shell按层次结构组织,任何shell都可以创建新shell。
新 shell 被视为创建它的父 shell 的子进程(子 shell)。

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

在后台运行子shell

除非我们指定子shell 在后台执行,否则父shell 会等待子shell 完成,然后再继续执行脚本的其余部分。
但是,要并行运行子shell程序,请在后台运行它们,这是通过子shell程序表达式后面的与号字符来完成的,如下所示:

#!/bin/bash 
for ip in {1..254}; do
 host=192.168.1.$ip
 (ping -c 1 $host > /dev/null 
 if [ "$?" = 0 ]
 then 
 echo $host
 fi) &
done

并行运行多个子shell

如果我们创建多个子shell作为后台进程,则可以并行运行任务。

通常,操作系统为每个进程和子进程使用不同的处理器或者内核,假设处理器或者内核的数量至少与进程的数量一样多。
否则,任务将分配给相同的处理器或者内核。
在这种情况下,处理器或者内核会在分配的任务之间不断切换,直到任务完成。

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

日期:2020-07-15 11:16:29 来源:oir作者:oir