You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在zsh中于后台任务结束时正确打印待处理任务?

解决zsh后台任务结束时打印待处理任务的问题

问题原因

你当前的写法里,每个后台任务是在独立子shell中执行的,子shell内的jobs命令只能识别该子shell自身的任务,无法获取主shell的完整后台任务列表,所以输出不符合预期。

解决方案

要实现任务结束时在主shell中打印当前待处理任务,可通过信号陷阱让后台任务结束时通知主shell执行jobs命令:

  1. 先在主shell中设置信号陷阱,收到USR1信号时执行jobs:
trap 'jobs' USR1
  1. 然后启动后台任务,每个任务结束时向主shell进程发送USR1信号($$代表主shell的PID):
{ sleep 5; echo ""; kill -USR1 $$; } &
{ sleep 5; echo ""; kill -USR1 $$; } &
{ sleep 5; echo ""; kill -USR1 $$; } &
{ sleep 5; echo ""; kill -USR1 $$; } &

这样每个后台任务完成后,会触发主shell执行jobs,输出的就是主shell中真实的后台任务状态,匹配你期望的效果。

如果想要更贴近你期望的输出格式(先列运行中任务,再显示完成任务),可以调整陷阱的执行命令,拆分输出内容:

trap 'jobs -r; jobs -d' USR1

jobs -r仅显示运行中的任务,jobs -d仅显示已完成的任务,这样输出顺序就会先呈现待处理的运行任务,再显示刚结束的任务。

内容的提问来源于stack exchange,提问作者Boris Rybalkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:01:30