Bash shell内置wait命令简介

Bash shell内置了wait命令,官方文档对wait解释如下:

wait

     wait [-n] [jobspec or pid …]

Wait until the child process specified by each process ID pid or job specification jobspec exits and return the exit status of the last command waited for. If a job spec is given, all processes in the job are waited for. If no arguments are given, all currently active child processes are waited for, and the return status is zero. If the -n option is supplied, wait waits for any job to terminate and returns its exit status. If neither jobspec nor pid specifies an active child process of the shell, the return status is 127.

wait命令可以使当前shell进程挂起,等待所指定的由当前shell产生的子进程退出后,wait命令才返回。wait命令的参数可以是进程ID或是job specification。举例如下:

root# sleep 10 &
[3] 876
root# wait 876
[3]+  Done                    sleep 10
root# sleep 20 &
[1] 877
root# wait %1
[1]+  Done                    sleep 20 

wait命令一个很重要用途就是在Bash shell的并行编程中,可以在Bash shell脚本中启动多个后台进程(使用&),然后调用wait命令,等待所有后台进程都运行完毕,Bash shell脚本再继续向下执行。像下面这样:

command1 &
command2 &
wait

Bash shell还有一个内置变量:$!,用来记录最后一个被创建的后台进程。

root# sleep 20 &
[1] 874
root# sleep 10 &
[2] 875
root# echo $!
875

echo $!输出结果是875,是第二个执行的sleep命令。

参考资料:
Does bash script wait for one process to finish before executing another?

学习Bash shell编程资料推荐

我一直觉得写好Bash shell脚本是一件很cool的事,短短几行代码,就能完成其它编程语言几十行甚至上百行代码才能完成的功能,可惜我自己写Bash shell脚本能力实在不敢恭维。在这篇文章,我把自己认为一些比较好的Bash shell编程资料分享出来,希望可以给大家一点帮助。

我个人看过的最好的Bash shell编程入门资料是《Linux程序设计》的第二章:shell程序设计,看这一章的同时自己动手实践,我觉得入门基本没问题了。

入门之后,我建议大家一定要看CU论坛上shell大牛网中人经典的《shell十三问》系列文章,这些文章把很多shell编程tricky的东西讲的很细,很明白。我每次读都有新的收获。

关于如何调试shell程序,推荐coolshell上的文章:如何调试bash脚本,在我这篇文章结尾提到的bashdb调试器,我这几天还用了一下。虽然比起gdb还差了很远(比如没有命令自动补全功能,等等),但总体感觉还可以,可以提高调试效率。

最后推荐两个网站:
http://www.shellcheck.net/:用来检测shell脚本,帮你发现问题。
http://explainshell.com/:用来帮你理解shell脚本。

好了,动手实践吧。Happy bashing! Happy hacking!