我正在尝试运行命令,将其写入文件,然后将该文件用于其他用途。
我需要的要点是:
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