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

如何实现sh脚本中仅在失败时输出子shell控制台内容?

实现多步初始化命令的静默执行(仅失败时输出日志)

问题场景

我有多步复杂的初始化操作,成功时可忽略所有输出,但每次操作的命令回显和输出会掩盖关键信息。希望达到的效果是:成功时完全静默,仅在(罕见的)失败时输出完整控制台内容。

尝试的实现(存在挂起问题)

我用sh编写了如下简洁实现,但测试时出现挂起:

export LOG=$(mktemp)
(
    > $LOG 2>&1
    set -e
    command1
    command2
) || { cat $LOG; exit 1; } 

说明

我没有用&&链式连接命令,因为这样无法单独回显每个命令。比如在包含10个命令的场景中,几乎无法定位出错的具体命令,而且&&会改变预期的控制台输入,造成新的黑盒问题。

需求明确

需要一种正确的实现方式:将子shell的命令回显和输出重定向到临时文件,所有命令成功则丢弃日志内容,失败则提前终止并将存储的控制台内容输出到主shell。

可行实现(更新)

根据采纳的答案,我实现了可用的sh示例(用true和false模拟成功/失败命令):

LOG=$(mktemp)
( 
  set -o errexit -o nounset -o pipefail -o xtrace
  false || (echo "First command errored" >&2 && false) 
  true || (echo "Second command errored" >&2 && false) 
) >$LOG 2>&1
[ $? -eq 0 ] || { cat $LOG;}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:42:11