Saya mencoba untuk menimpa file dengan output perintah, tetapi hanya jika ada output. Artinya, saya biasanya mau
mycommand > myfile
tetapi jika ini akan ditimpa myfile
dengan data kosong, saya ingin mempertahankan versi lama myfile
. Saya pikir sesuatu menggunakan ifne
harus mungkin, a la
mycommand | ifne (cat > myfile)
tapi itu tidak berhasil ...
Pendekatan tidak langsung
mycommand | tee mytempfile | ifne mv mytempfile myfile
berfungsi, tapi saya menganggap penggunaan file temp tidak memenuhi syarat.
T: Mengapa ide pertama saya tidak berfungsi? Bisakah ini dibuat bekerja? Atau adakah solusi lain yang bagus dan mungkin sama sekali berbeda untuk masalah awal saya?
Jawaban:
Pendekatan pertama Anda berhasil, Anda hanya perlu memberikan perintah kepada
ifne
(lihatman ifne
):Jadi, Anda perlu memberikan perintah untuk menjalankannya. Anda hampir sampai,
tee
akan bekerja:Jika perintah Anda tidak menghasilkan data dalam jumlah besar, jika cukup kecil untuk ditampung dalam sebuah variabel, Anda juga bisa melakukannya:
sumber
Solusi pejalan kaki:
Yaitu, simpan output ke file sementara, lalu uji apakah itu kosong atau tidak. Jika tidak kosong, salin isinya ke file Anda. Pada akhirnya, hapus file sementara.
Saya menggunakan
cat "$tmpfile" >myfile
daripadacp "$tmpfile" myfile
(ataumv
) untuk mendapatkan efek yang sama seperti yang Anda dapatkanmycommand >myfile
, yaitu untuk memotong file yang ada dan mempertahankan kepemilikan dan izin.Jika
$TMPDIR
(digunakan olehmktemp
) pada sistem file yang terpasang di memori, maka ini tidak akan menulis ke disk selain dari kemungkinan saat menulismyfile
. Selain itu akan lebih portabel daripada menggunakanifne
.sumber