コマンド出力でファイルを上書きしようとしていますが、出力が出る前は上書きされません。つまり、私は普通
mycommand > myfile
しかし、空のデータで上書きされるのであれば、以前のバージョンをmyfile
維持したいのですが、myfile
何かを使えばifne
可能だと思います。
mycommand | ifne (cat > myfile)
しかし、これはうまくいきません...
間接的な方法
mycommand | tee mytempfile | ifne mv mytempfile myfile
動作しますが、一時ファイルを使用することはエレガントではないと思います。
尋ねる:最初のアイデアはなぜ効果がなかったのですか?動作させることができますか?それとも私の元の問題に対するもう一つの良い解決策はありますか?
答え1
最初の方法が機能したら、次のコマンドを実行しますifne
(参考文献を参照man ifne
)。
NAME
ifne - Run command if the standard input is not empty
SYNOPSIS
ifne [-n] command
DESCRIPTION
ifne runs the following command if and only if the standard input is
not empty.
だから実行コマンドを与えなければなりません。ほぼすべてが来てtee
働く準備ができました。
command | ifne tee myfile > /dev/null
コマンドによって生成されるデータが多くなく、データが変数に入るのに十分小さい場合は、次のこともできます。
var=$(mycommand)
[[ -n $var ]] && printf '%s\n' "$var" > myfile
答え2
歩行者ソリューション:
tmpfile=$(mktemp)
mycommand >"$tmpfile"
if [ -s "$tmpfile" ]; then
cat "$tmpfile" >myfile
fi
rm -f "$tmpfile"
つまり、出力を一時ファイルに保存してから空であることをテストします。空でない場合は、その内容をファイルにコピーします。最後に、一時ファイルを削除してください。
cat "$tmpfile" >myfile
代わりにcp "$tmpfile" myfile
(または)を使用してmv
を使用するのと同じ効果を得ましたmycommand >myfile
。これは、既存のファイルを切り捨て、所有権と権限を保存することです。
$TMPDIR
(によって)メモリマウントファイルシステムにある場合は、mktemp
可能な場合を除いてディスクに書き込まれませんmyfile
。また、使用されるよりも携帯性が良いですifne
。