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

如何仅在命令执行成功时将其输出重定向至文件且避免失败时覆盖原有内容?

我完全懂你的痛点——手动创建临时文件确实有点啰嗦,而你那个|| cat file的技巧虽然能保住文件内容,但逻辑绕不说,还得读两次文件。这里给你几个更简洁的方案,不用手动管理临时文件,完美解决你的需求:

1. 用变量暂存输出(纯Bash内置方案,最简洁)

把命令的输出先存到变量里,只有当命令执行成功时,再把变量内容写入文件:

output=$(<command>) && printf '%s\n' "$output" > file

这个方法完全依赖Bash自带功能,不需要额外工具。用printf而不是echo是因为它能更安全地处理包含特殊字符、换行或者空白的输出——避免出现意外格式问题。如果你的命令输出没有特殊格式,用echo "$output"也能工作,但printf是更稳妥的选择。

2. 用sponge工具(专用工具,更优雅)

如果你系统里能安装moreutils包(大部分发行版可以通过apt install moreutils、yum install moreutils或者Homebrew的brew install moreutils搞定),sponge就是专门为这种场景设计的:它会先把标准输入的所有内容读完,再写入目标文件,从根源上避免了提前截断文件的问题。结合&&确保只有命令成功时才修改文件:

output=$(<command>) && sponge file <<< "$output"

sponge会帮你处理写入的细节,不用自己操心输出的格式问题,用起来非常省心。

3. 自动生成临时文件(改进版临时文件方案)

如果你觉得临时文件的思路没问题,只是不想手动命名,可以用mktemp自动生成唯一的临时文件,避免文件名冲突的风险:

temp=$(mktemp) && <command> > "$temp" && mv "$temp" file || rm "$temp"

这个命令会自动创建临时文件,命令成功就替换目标文件,失败就自动删掉临时文件,全程不用手动管文件名,比手动命名临时文件安全得多。

为什么你原来的命令会失效?

你之前用的cat <<< $(<command>) > file之所以会清空文件,是因为Bash在执行整个命令之前,就会先打开file并截断它——不管后面的命令成功与否,文件已经被提前清空了。上面的所有方案都是先确保命令执行成功,再去处理文件的写入,从根本上避免了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:17:27