web-dev-qa-db-ja.com

エラーで空のファイルを取得せずに、コマンドをファイルに出力するにはどうすればよいですか?

コマンドを実行してファイルに書き込もうとしていますが、そのファイルを別の目的で使用しています。

私が必要とするものの要点は:

myAPICommand.exe parameters > myFile.txt

問題は、myAPICommand.exeが頻繁に失敗することです。問題のいくつかを修正して再実行しようとしましたが、「既存のファイルを上書きできません」という問題に遭遇しました。別のrmコマンドを実行して空のmyFile.txtをクリーンアップし、myAPICommand.exeを再実行する必要があります。

これは最も深刻な問題ではありませんが、迷惑です。

基本コマンドが失敗したときに空のファイルを書き込まないようにするにはどうすればよいですか?

6
goodguy5

「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)。

Q:基本コマンドが失敗したときに、空のファイルを書き込まないようにするにはどうすればよいですか?

要件はありますか?単に出力を変数に格納し、それが空かどうかを確認するだけです。次の例を確認してください(変数を確認する方法は、ニーズに合わせて微調整する必要があることに注意してください。この例では、引用符を付けなかったか、${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
11
Evolter

コマンドが失敗した場合は、実行後にファイルを削除できます。

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

しかし、代わりにファイルを破壊することをお勧めします:

myAPICommand parameters >| myFile.txt

詳細は シェルの制御演算子とリダイレクト演算子は何ですか? を参照してください。

11
Stephen Kitt

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
3