Linux

如何將命令輸出到文件,而不會出現錯誤的空白文件?

  • December 23, 2018

我正在嘗試執行命令,將其寫入文件,然後將該文件用於其他用途。

我需要的要點是:

myAPICommand.exe parameters > myFile.txt

問題是myAPICommand.exe失敗了很多。我試圖解決一些問題並重新執行,但我遇到了“無法覆蓋現有文件”。我必須執行一個單獨的rm命令來清理空白myFile.txt,然後重新執行myAPICommand.exe

這不是最嚴重的問題,但很煩人。

當我的基本命令失敗時,如何避免寫入空白文件?

您必須設置“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

引用自:https://unix.stackexchange.com/questions/489489