问:当我的基本命令失败时,如何避免写入空白文件?

问:当我的基本命令失败时,如何避免写入空白文件?

我正在尝试运行命令,将其写入文件,然后将该文件用于其他用途。

我需要的要点是:

myAPICommand.exe parameters > myFile.txt

问题是myAPICommand.exe失败很多。我尝试修复一些问题并重新运行,但遇到“无法覆盖现有文件”的问题。我必须运行一个单独的rm命令来清理空白myFile.txt,然后重新运行myAPICommand.exe

这不是最严重的问题,但很烦人。

当我的基本命令失败时,如何避免写入空白文件?

答案1

您必须设置“noclobber”,请检查以下示例:

$ echo 1 > 1  # create file
$ cat 1
1
$ echo 2 > 1  # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1  # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1  # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4

“noclobber”仅用于覆盖,但您仍然可以附加:

$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1

要检查您是否设置了该标志,您可以键入echo $-并查看是否设置了C标志(或set -o |grep clobber)。

问:当我的基本命令失败时,如何避免写入空白文件?

有什么要求吗?您可以简单地将输出存储在变量中,然后检查它是否为空。检查以下示例(请注意,检查变量的方式需要根据您的需要进行微调,在示例中我没有引用它或使用类似${cmd_output+x}检查变量是否设置的内容,以避免编写仅包含空格的文件。

$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e '\n\n\n')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes

$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt

不使用单个变量保存整个输出的示例:

log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log

答案2

运行后可以删除该文件,如果命令失败,使用

myAPICommand parameters > myFile.txt || rm myFile.txt

但我建议改为破坏该文件:

myAPICommand parameters >| myFile.txt

shell 的控制和重定向运算符是什么?了解详情。

答案3

您可以创建一个脚本来运行 myAPICommand.exe,但首先让它删除 myFile.txt(如果存在)。那么就不用不断的执行rm命令来清理了。

喜欢:

if [ -e myFile.txt ]
then
    rm myFile.txt && myAPICommand.exe
else

您也可以这样做,以便您的命令自行清理。如果文件为空,请添加如下内容。

喜欢:

if [ -s myFile.txt ]
then
        EXIT 0
else
        rm myFile.txt && EXIT 1
fi

相关内容