如何实现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
相关产品推荐
相关产品推荐

