Shell 持续运行命令直至执行成功,有时候命令只有在满足某些条件时才能够成功执行。例如,在下载文件之前必须先创建该文件。这种情况下,你可能希望重复执行命令,直到成功为止。
实战演练
定义如下函数:
repeat()
{
while true
do
$@ && return
done
}
或者把它放入shell的rc文件,更便于使用:
repeat() { while true; do $@ && return; done }
工作原理
函数repeat()
中包含了一个无限while
循环,该循环执行以函数参数形式(通过$@
访问)传入的命令。如果命令执行成功,则返回,进而退出循环。
补充内容
我们已经知道了用于重复执行命令,直到其执行成功的基本做法。接着来看看更高效的方式。
- 一种更快的做法
在大多数现代系统中,true
是作为/bin中的一个二进制文件来实现的。这就意味着每执行一次之前提到的while
循环,shell就不得不生成一个进程。为了避免这种情况,可以使用shell的内建命令:
,该命令的退出状态总是为0:
repeat() { while :; do $@ && return; done }
尽管可读性不高,但是肯定比第一种方法快。
- 加入延时
假设你要用repeat()从Internet上下载一个暂时不可用的文件,不过这个文件只需要等一会就能下载。一种方法如下:
repeat wget -c http://www.example.com/software-0.1.tar.gz
如果采用这种形式,会产生很多发往www.example.com的流量,有可能会对服务器造成影响。(可能也会牵连到你自己;如果服务器认为你是在向其发起攻击,就会把你的IP地址列入黑名单。)要解决这个问题,我们可以修改函数,加入一段延时:
repeat() { while :; do $@ && return; sleep 30; done }
这样命令每30秒才会运行一次。