wait 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
wait——作业控制(Shell 内建),归类在进程管理命令族(见进程管理与调度命令族)。在脚本里并发跑了几个后台任务,想等它们全跑完再继续?wait 就是那道"同步闸门"。
wait 让当前 shell 暂停,直到指定的后台作业(或所有后台作业)结束,再继续往下走。它返回的是被等待进程的退出码。
一、基本用法
bash
sleep 3 & sleep 5 &
wait # 等所有后台任务结束(这里约 5 秒后继续)
echo "全部完成"不带参数时,wait 等"当前 shell 启动的所有后台作业"全部结束。这是并发脚本里做"汇合点"的标准写法。
二、按 PID / 作业号等特定任务
bash
sleep 10 & pid=$!
sleep 2 &
wait $pid # 只等第一个(PID 存进 $!),不等别的
echo "第一个任务结束,退出码 $?"
$!是上一个后台任务的 PID,常和 wait 搭配精确等待某一个。wait %1也能用作业号。wait 的返回值是被等进程的退出状态——用它判断任务成功与否。
三、实战:并发处理 + 汇合
bash
#!/bin/bash
for f in *.log; do
gzip "$f" & # 并发压缩
done
wait # 全部压完才往下
echo "所有日志已压缩"这是 wait 最实用的形态:把循环体丢后台实现并发,循环结束后一个
wait做汇合,保证后续步骤在所有任务完成后才执行。比串行快得多。
四、踩坑:wait 只认"自家"作业
bash
# wait 只能等当前 shell 启动的后台作业;
# 对已经脱离(disown)或用 nohup 起的、或别的 shell 起的进程,wait 等不到wait 的可见范围和 jobs 一样,局限于当前 shell 的作业表。脚本里
$!捕获的 PID 才是可靠等待对象;跨 shell 的进程 wait 管不到。另外wait在脚本里返回的是被等进程退出码,可用于错误判断。
五、实战:等待并收集结果
bash
for url in "$@"; do
(curl -s "$url" -o "$(basename "$url").html") &
done
wait
echo "下载完成,失败的任务已非 0 退出"一句话总结
wait = 阻塞等后台任务结束:不带参数等所有后台作业,带 PID/%n 等特定一个,返回值是被等进程的退出码;脚本里用它做"并发 + 汇合"。它只认当前 shell 的作业(同 jobs 的范围),跨 shell 等不到。