Qiu*_*fan 5 linux bash shell redirect io-redirection
通常,我们可以将命令输出重定向到文件,如下所示:
cat a.txt >> output.txt
Run Code Online (Sandbox Code Playgroud)
正如我尝试的那样,如果cat失败了,output.txt仍然会创建,这不是我期望的。我知道我可以这样测试:
if [ "$?" -ne "0"]; then
rm output.txt
fi
Run Code Online (Sandbox Code Playgroud)
但是,如果在执行output.txt之前已经存在此类问题,则可能会导致一些开销问题cat。所以我还需要存储output.txt状态before cat,如果在cat执行之前已经有这样的output.txt ,我不应该output.txt错误地rm ...但是在竞争条件下仍然可能存在问题,如果还有其他进程在此之前创建此output.txt怎么办我cat很紧密吗?
那么,有什么简单的方法可以使如果命令失败,重定向output.txt将被删除,甚至没有创建?
固定输出文件名是个坏消息;不要使用它们。
\n\n您可能应该重新设计处理,以便获得带有日期标记的文件名。如果失败,您应该使用mktemp命令创建一个临时文件,将要执行的命令写入其中,当该命令成功时,您可以将临时文件移动到“final”输出\xe2\x80\x94并且您可以在失败时自动清理临时的。
outfile="./output-$(date +%Y-%m-%d.%H:%M:%S).txt"\ntmpfile="$(mktemp ./gadget-maker.XXXXXXXX)"\n\ntrap "rm -f \'$tmpfile\'; exit 1" 0 1 2 3 13 15\n\nif cat a.txt > "$tmpfile"\nthen mv "$tmpfile" "$outfile"\nelse rm "$tmpfile"\nfi\n\ntrap 0\nRun Code Online (Sandbox Code Playgroud)\n\n如果您坚持的话,可以简化为outfile(output.txt但这并不安全)。您可以在该命令中使用任何您喜欢的前缀mktemp。请注意,通过在当前目录中创建临时文件(最终输出文件也将在其中创建),您可以避免在操作阶段进行跨设备文件复制mv\xe2\x80\x94 它是一个link()系统unlink()调用(或者可能是甚至一个rename()系统调用(如果您的计算机上存在这样的东西;仅在 Mac OS X 上)。
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |