加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在Bash中,一旦命令失败,如何不创建重定向输出文件

发布时间:2020-12-13 22:57:49 所属栏目:Linux 来源:网络整理
导读:通常我们可以将命令输出重定向到文件,如下所示: cat a.txt output.txt 正如我尝试的那样,如果cat失败,仍会创建output.txt,这不是我的预期.我知道我可以这样测试: if [ "$?" -ne "0"]; then rm output.txtfi 但是,在我的cat执行之前已经存在这样的output.tx
通常我们可以将命令输出重定向到文件,如下所示:

cat a.txt >> output.txt

正如我尝试的那样,如果cat失败,仍会创建output.txt,这不是我的预期.我知道我可以这样测试:

if [ "$?" -ne "0"]; then
    rm output.txt
fi

但是,在我的cat执行之前已经存在这样的output.txt时,这可能会导致一些问题开销.
所以我还需要在cat之前存储output.txt状态,如果在执行cat之前已经有这样的output.txt,我不应该错误地输出output.txt …但是在竞争条件下可能仍有问题,如果有的话进程在我的猫非常接近之前创建这个output.txt?

那么有没有简单的方法,如果命令失败,重定向output.txt将被删除,甚至不会被创建?

解决方法

固定输出文件名是坏消息;不要使用它们.

您可能应该重新设计处理,以便您有一个带日期戳的文件名.如果失败了,你应该使用mktemp命令创建一个临时文件,让你想要执行的命令写入该命令,当命令成功时,你可以将临时文件移动到’final’输出 – 你可以自动清理暂时失败.

outfile="./output-$(date +%Y-%m-%d.%H:%M:%S).txt"
tmpfile="$(mktemp ./gadget-maker.XXXXXXXX)"

trap "rm -f '$tmpfile'; exit 1" 0 1 2 3 13 15

if cat a.txt > "$tmpfile"
then mv "$tmpfile" "$outfile"
else rm "$tmpfile"
fi

trap 0

如果你坚持,你可以将outfile简化为output.txt(但它不安全).您可以使用mktemp命令使用任何前缀.请注意,通过在当前目录中创建临时文件,也将创建最终输出文件,您可以避免在操作的mv阶段复制跨设备文件 – 它是一个link()和一个unlink()系统调用(或者甚至是一个rename()系统调用,如果你的机器上存在这样的东西;它只在Mac OS X上存在).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读