コマンドを実行してファイルに書き込もうとしていますが、そのファイルを別の目的で使用しています。
私が必要とするものの要点は:
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
コマンドが失敗した場合は、実行後にファイルを削除できます。
myAPICommand parameters > myFile.txt || rm myFile.txt
しかし、代わりにファイルを破壊することをお勧めします:
myAPICommand parameters >| myFile.txt
詳細は シェルの制御演算子とリダイレクト演算子は何ですか? を参照してください。
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