Linux
如何將命令輸出到文件,而不會出現錯誤的空白文件?
我正在嘗試執行命令,將其寫入文件,然後將該文件用於其他用途。
我需要的要點是:
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