Ini sangat mungkin, Anda hanya perlu memastikan bahwa pada saat Anda menulis hasilnya, Anda menulisnya ke file yang berbeda. Ini dapat dilakukan dengan menghapus file setelah membuka deskriptor file, tetapi sebelum menulis padanya:
exec 3<file ; rm file; COMMAND <&3 >file ; exec 3>&-
Atau baris demi baris, untuk lebih memahaminya:
exec 3<file
rm file
COMMAND <&3 >file
exec 3>&-
Ini masih berisiko untuk dilakukan, karena jika COMMAND gagal berjalan dengan benar, Anda akan kehilangan konten file. Itu dapat dikurangi dengan memulihkan file jika COMMAND mengembalikan kode keluar bukan nol:
exec 3<file ; rm file; COMMAND <&3 >file || cat <&3 >file ; exec 3>&-
Kita juga bisa mendefinisikan fungsi shell agar lebih mudah digunakan:
replace() { exec 3<$1 ; rm $1; ${@:2} <&3 >$1 || cat <&3 >$1 ; exec 3>&- }
Contoh:
$ echo aaa > test
$ replace test tr a b
$ cat test
bbb
Juga, perhatikan bahwa ini akan menyimpan salinan lengkap dari file asli (hingga deskriptor file ketiga ditutup). Jika Anda menggunakan Linux, dan file yang Anda proses terlalu besar untuk memuat dua kali pada disk, Anda dapat memeriksa skrip ini yang akan menyalurkan file ke perintah yang ditentukan blok-demi-blok sambil membatalkan alokasi yang sudah diproses blok. Seperti biasa, baca peringatan di halaman penggunaan.