如何在zsh中于后台任务结束时正确打印待处理任务?
解决zsh后台任务结束时打印待处理任务的问题
问题原因
你当前的写法里,每个后台任务是在独立子shell中执行的,子shell内的jobs命令只能识别该子shell自身的任务,无法获取主shell的完整后台任务列表,所以输出不符合预期。
解决方案
要实现任务结束时在主shell中打印当前待处理任务,可通过信号陷阱让后台任务结束时通知主shell执行jobs命令:
- 先在主shell中设置信号陷阱,收到
USR1信号时执行jobs:
trap 'jobs' USR1
- 然后启动后台任务,每个任务结束时向主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
相关产品推荐
相关产品推荐

