如何创建子shell
在 Bash shell 脚本中,使用括号表示法创建一个子 shell:
#!/bin/bash # subshell-example.sh with endless loop ( while [ 1 ] do echo "Subshell running . . ." done )
在示例中,while 循环被括在括号中,这使得它在执行脚本文件的 shell 的子 shell 中执行。
子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 语句告诉父进程在继续执行脚本的其余部分之前等待子进程完成: