如何执行多命令且仅全部成功时输出,任意失败则无输出?
解决命令批量执行的输出控制问题
要实现仅当command1、command2、command3全部执行成功时才显示所有输出,任意命令失败则无任何输出,核心思路是先将所有命令的输出暂存,等确认全部执行成功后再输出。以下是两种可行的实现方式:
方式一:使用临时文件存储输出
适合输出内容较大的场景,避免变量存储的限制:
# 创建临时文件 tmpfile=$(mktemp) # 依次执行命令,将所有输出(标准输出+错误输出)写入临时文件,仅当前面命令成功时才执行下一个 if command1 >> "$tmpfile" 2>&1 && command2 >> "$tmpfile" 2>&1 && command3 >> "$tmpfile" 2>&1; then # 所有命令成功,打印临时文件内容 cat "$tmpfile" fi # 清理临时文件 rm "$tmpfile"
>> "$tmpfile":将命令的标准输出追加到临时文件2>&1:将标准错误输出重定向到标准输出,确保错误信息也被捕获- 只有三个命令都返回成功状态码(0)时,才会执行
cat "$tmpfile"输出内容
方式二:使用变量存储输出
适合输出内容较小的场景,无需创建临时文件:
# 捕获所有命令的输出,仅当前面命令成功时才执行后续命令 output=$({ command1 && command2 && command3; } 2>&1) # 判断整体执行状态,成功则输出内容 if [ $? -eq 0 ]; then echo "$output" fi
{ ...; }:将多个命令作为一个整体执行,捕获所有输出2>&1:同样捕获错误输出$?获取整体命令块的退出码,只有全部成功时才会打印存储的输出
为什么原方式command1 && command2 && command3不符合需求?
因为每个命令的输出是实时输出到终端的,一旦command1执行成功,它的输出就已经显示在终端上,后续command2失败也无法撤回已显示的内容,所以必须先暂存所有输出,再统一判断后输出。
内容的提问来源于stack exchange,提问作者medisamm
相关产品推荐
相关产品推荐

