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

Bash串行执行脚本序列时如何重定向stderr并获取失败脚本名称

需求说明
  • 搭建邮件通知系统,需要将执行失败的脚本信息存入txt文件,每日运行一次Python脚本读取该文件,整合所有失败任务内容后发送通知邮件
  • 当前任务执行链路分两类:
    • Python脚本执行链:script1.py && script2.py && ... && scriptN.py 2>> "/home/mydir/failedscripts.txt"
    • 带入参的Shell脚本执行链:script1.sh && script2.sh arg1 && ... && scriptN.sh 2>> "/home/mydir/failedscripts.txt"
  • 现有stderr重定向功能运行正常,新增要求:除原有错误输出外,需要将失败脚本的名称、字符串DONE一同追加写入/home/mydir/failedscripts.txt
已尝试的失效方案
  • 方案1:script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" || echo $_,"done">> "/home/mydir/failedscripts.txt"
  • 方案2:script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" ; echo $_,"done">> "/home/mydir/failedscripts.txt"
  • 方案3:script1 && script2 && .. && scriptN 2>> "/home/mydir/failedscripts.txt" && echo $_,"done">> "/home/mydir/failedscripts.txt"

以上三种写法最终仅会向目标文件写入failedscripts.txt,done,完全不符合预期。

问题根因与实现方案
  • 根因:shell内置变量$_的语义为上一条执行命令的最后一个参数,在当前场景下就是stderr重定向的目标文件路径,因此输出的内容永远是文件路径相关的文本,而非失败脚本的名称。
  • 要精准捕获链路中执行失败的脚本名称,不能依赖简单的命令拼接逻辑,需要为每个独立执行的脚本绑定单独的失败捕获分支,参考实现如下:
    script1.py 2>> "/home/mydir/failedscripts.txt" || echo "script1.py DONE" >> "/home/mydir/failedscripts.txt" \
    && script2.sh arg1 2>> "/home/mydir/failedscripts.txt" || echo "script2.sh arg1 DONE" >> "/home/mydir/failedscripts.txt" \
    && scriptN.py 2>> "/home/mydir/failedscripts.txt" || echo "scriptN.py DONE" >> "/home/mydir/failedscripts.txt"
    
  • 实现效果:原有&&串联的执行逻辑不变,只要前置脚本执行失败,后续脚本就会终止运行;每个脚本单独配置stderr重定向,执行失败时自动将脚本名称与DONE标记追加写入目标文件,完全匹配Python脚本读取文件拆分失败条目的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 05:54:04