如何使用 Linux 睡眠命令暂停 Bash 脚本

sleep 命令在你的 Linux 系统中会让计算机什么都不做。这似乎有些反常,但有时确实需要一段不活动的时间。本文将阐述如何有效利用这个 Bash shell 命令。

使用 sleep 非常简单。在命令行中输入 sleep,接着一个空格,然后输入一个数字,最后按回车键。

sleep 5

光标会消失五秒钟,然后重新出现。发生了什么?在命令行使用 sleep 会指示 Bash 暂停处理你指定的时间。在上述示例中,这个时间是 5 秒。

我们可以以天、小时、分钟以及秒为单位设定 sleep 的时间。为此,在时间数值后添加 dhms 后缀。如果要让 sleep 暂停一天四小时七分钟五秒,可以使用如下命令:

sleep 1d 4h 7m 5s

后缀 s (代表秒)是可选的。如果没有后缀,sleep 会将任何时间数值视为秒。假设你想让 sleep 暂停 5 分 20 秒。一个正确的命令格式如下:

sleep 5m 20

如果你忘记在分钟数值后添加 m 后缀,你将会指示 sleep 先暂停 5 秒,然后再暂停 20 秒。所以 sleep 总共会暂停 25 秒。

很多命令要求你按特定顺序输入参数,但 sleep 非常灵活。你可以按任意顺序输入它们,sleep 都能理解。你还可以使用浮点数作为参数。例如,0.5h 表示你希望 sleep 暂停半小时,这是一个有效的方法。

以下所有命令(尽管越来越奇怪)都指示 sleep 暂停 10 秒。

sleep 10
sleep 5 5s
Sleep 1 1 1s 1 1 1s 1 2
sleep 0.16667m

在命令执行前使用 sleep 暂停

sleep 命令可以用来在执行某个命令之前暂停。以下命令会暂停 15 秒,然后发出哔哔声。

sleep 15 && echo -en ' 07'

使用 sleep 在两个命令之间暂停

你可以使用 sleep 在两个命令之间引入暂停。以下命令会列出 Documents 目录中的文件,暂停五秒钟,然后将当前工作目录切换到你的主目录:

ls -R ~/Documents && sleep 5 && cd ~

使用 sleep 暂停脚本的执行

你可以在 shell 脚本中使用 sleep 命令来精确地暂停脚本的执行。通常,这样做是为了给某个进程足够的时间完成,然后再让脚本继续处理。你也可以使用它来限制脚本对其他资源的请求。

为了具体展示这一点,这里有一个脚本使用 curl 调用 Google Web 服务。当你使用 国际标准书号 查询一本书的编号时,它会返回有关该书的 JSON 数据。我们可以通过将数据传递给 jq 工具来解析该数据以提取书名。为了避免脚本对 Web 服务造成过大压力,它会在 Web 请求之间休眠一秒钟。

创建一个包含以下文本的文件,并将其保存为 check_book.sh

#!/bin/bash

for book in `cat $1`
do
 echo $book":"
 curl -s https://www.googleapis.com/books/v1/volumes?q=isbn:$book | jq '.items | .[] | .volumeInfo.title'
 echo ""
 sleep 1
done

echo "All done."

输入以下命令设置执行权限,使脚本可执行。

chmod +x check_book.sh

这个脚本需要 curljq 工具。如果你使用的是 Ubuntu 或其他基于 Debian 的发行版,请使用 apt-get 将这些软件包安装到你的系统中。在其他 Linux 发行版上,请改用你的 Linux 发行版的包管理工具。

sudo apt-get install curl
sudo apt-get install jq

创建一个包含以下数字的文本文件,并将其保存为 books.txt

9781565921276
9781874416685
9781565921672
9780521431088
9781491941591

运行 check_book.sh 脚本,并将 books.txt 文件作为参数传入。

./check_book.sh books.txt

每隔一秒,向 Google 网络服务发送一个请求。查询每个 ISBN 编号后不久,就会显示书名。

这就是 sleep 命令的全部。check_book.sh 脚本的内部工作原理超出了本文的范围。之所以选择这个脚本,仅仅是为了演示 sleep 命令的有效使用。如果你想详细了解该脚本的两个主要组成部分,请参考 curl项目页面jq在线手册