gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:35:05 25 4
gpt4 key购买 nike

通常我们可以将命令输出重定向到文件,如下所示:

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,我不应该rm output.txt 错误......但在竞争条件上可能仍然存在问题,如果任何其他进程在我的 cat 之前非常接近地创建此 output.txt 怎么办?

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

最佳答案

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

您可能应该重新设计处理过程,以便您拥有带日期戳的文件名。如果失败,您应该使用 mktemp 命令创建一个临时文件,将要执行的命令写入该文件,当命令成功时,您可以将临时文件移动到“最终”输出— 并且您可以在失败时自动清理临时文件。

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)。

关于linux - 在 Bash 中,如何在命令失败后不创建重定向输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30748064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com