Bash wait 命令示例

linuxbashopen source更新于 2026/2/4 5:07:17

简介

Bash shell 是 Unix/Linux 环境中使用最广泛的 shell 之一。其中最有用的命令之一是 wait 命令。本文将通过示例探讨 Bash wait 命令及其用法。

什么是 Bash wait 命令?

wait 命令是 Bash shell 的内置命令,用于等待后台进程的终止。这意味着 Bash shell 将暂停执行,直到指定进程完成。

Bash wait 命令的用法

wait 命令的基本语法如下:

wait [n]

其中,"n"是我们要等待的后台进程的进程 ID。如果未指定进程 ID,则 wait 命令将等待所有后台进程完成。

等待单个进程

假设我们有一个脚本在后台运行一个长时间运行的命令 -

#!/bin/bash
sleep 10 &
echo "Command running in background..."

在此脚本中,我们使用 "&" 符号在后台运行"sleep"命令。然后我们将一条消息打印到控制台。如果我们想等待"sleep"命令完成后再继续执行脚本,可以使用 wait 命令 -

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait
echo "Command has completed!"

在此更新的脚本中,我们在后台启动"sleep"命令后添加了"wait"命令。这意味着脚本将等待"sleep"命令完成后再将最终消息打印到控制台。

等待多个进程

有时,我们可能需要等待多个在后台运行的进程。在这种情况下,我们可以指定每个要等待的进程的进程 ID -

#!/bin/bash
sleep 5 &
sleep 10 &
sleep 15 &
echo "Commands running in background..."
wait %1 %2 %3
echo "All commands have completed!"

在此脚本中,我们在后台运行三个"sleep"命令,每个命令的持续时间不同。然后,​​我们将一条消息打印到控制台。为了等待所有三个命令完成,我们使用"%"符号将它们的进程 ID 指定为 wait 命令的参数。

处理错误

如果我们尝试等待一个不存在的进程,wait 命令将返回错误。我们可以使用"||"运算符来处理此错误 -

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait || echo "Process not found!"
echo "Command has completed!"

在此脚本中,我们在后台运行"sleep"命令,并使用 wait 命令等待其完成。如果"sleep"命令不存在,则 wait 命令将返回错误。我们可以使用"||"运算符处理此错误,该运算符仅在左侧命令返回非零退出代码时才执行右侧命令。

在管道中使用 wait

wait 命令也可以与管道一起使用。例如,如果我们有一个包含两个命令的管道,我们可以等待第二个命令完成后再继续执行脚本 -

#!/bin/bash
echo "Starting pipeline..."
echo "hello world" | grep "world" &
wait %1
echo "Pipeline has completed!"

在此脚本中,我们有一个由两个命令组成的管道:"echo "hello world""和"grep "world""。我们使用"&"符号在后台运行管道,然后使用 wait 命令等待第二个命令("grep"命令)完成。

在循环中使用 wait

我们还可以在循环中使用 wait 命令来等待多个后台进程完成。例如,假设我们有一个脚本,它会循环启动多个后台进程 -

#!/bin/bash
for i in {1..5}
do
   sleep $i &
done
echo "Background processes started..."
wait
echo "All processes have completed!"

在此脚本中,我们使用循环在后台启动五个"sleep"命令。然后,我们向控制台打印一条消息,并使用 wait 命令等待所有后台进程完成。所有进程完成后,我们向控制台打印最后一条消息。

将 wait 与命令替换结合使用

我们也可以将 wait 命令与命令替换结合使用。例如,假设我们有一个脚本,它使用命令替换生成后台进程列表 -

#!/bin/bash
processes=$(for i in {1..3}; do sleep $i & echo $!; done)
echo "Background processes started: $processes"
wait $processes
echo "All processes have completed!"

在此脚本中,我们使用命令替换生成后台进程 ID 列表。我们使用循环启动后台进程,然后使用"echo $!"命令打印每个进程的进程 ID。然后,我们使用 wait 命令等待所有后台进程完成,并使用命令替换生成的进程 ID 列表。所有进程完成后,我们将最终消息打印到控制台。

将 Timeout 与 wait 结合使用

wait 命令也可以与 timeout 命令结合使用,以限制等待进程完成的时间。例如,假设我们有一个脚本在后台启动一个长时间运行的进程,我们希望等待它完成,但也希望限制等待的时间 -

#!/bin/bash
sleep 20 &
echo "Command running in background..."
timeout 10s wait
if [ $? -eq 0 ]; then
echo "Command has completed!"
else
echo "Command timed out!"
fi

在此脚本中,我们在后台启动一个持续时间为 20 秒的"sleep"命令。然后,我们向控制台打印一条消息,并使用 timeout 命令将等待"sleep"命令完成的时间限制为 10 秒。如果"sleep"命令在规定时间内完成,我们会向控制台打印一条消息,表明该命令已完成。如果命令超时,我们会打印一条消息,表明该命令已超时。

将 wait 与 Trap 结合使用

我们还可以将 wait 命令与 trap 命令结合使用,以便在必要时处理信号并终止后台进程。例如,假设我们有一个启动后台进程的脚本,我们希望在用户按下 Ctrl+C 时终止该进程 -

#!/bin/bash
trap "kill %1" SIGINT
sleep 20 &
echo "Command running in background..."
wait
echo "Command has completed!"

在此脚本中,我们使用 trap 命令来处理 SIGINT 信号,该信号在用户按下 Ctrl+C 时发送。我们指定"kill %1"命令在收到信号时终止后台进程。然后,我们在后台启动"sleep"命令,并使用 wait 命令等待其完成。命令完成后,我们会将一条消息打印到控制台。

结论

Bash wait 命令是一个有用的工具,它允许我们等待后台进程的完成。我们可以使用它来确保脚本以可预测且有序的方式运行,并在进程未按预期完成时处理错误。通过了解 wait 命令的基础知识及其用法,我们可以提高 Bash 脚本的可靠性和功能性。


相关文章


有用资源