Bu çok mümkün, sadece çıktıyı yazdığınız anda onu farklı bir dosyaya yazdığınızdan emin olmalısınız. Bu, bir dosya tanımlayıcısını açtıktan sonra, ancak ona yazmadan önce dosyayı kaldırarak yapılabilir:
exec 3<file ; rm file; COMMAND <&3 >file ; exec 3>&-
Veya daha iyi anlamak için satır satır:
exec 3<file
rm file
COMMAND <&3 >file
exec 3>&-
Yine de yapılması riskli bir şey, çünkü COMMAND düzgün çalışmazsa dosya içeriğini kaybedersiniz. COMMAND sıfırdan farklı bir çıkış kodu döndürürse dosyayı geri yükleyerek bu durum hafifletilebilir:
exec 3<file ; rm file; COMMAND <&3 >file || cat <&3 >file ; exec 3>&-
Kullanımı daha kolay hale getirmek için bir kabuk işlevi de tanımlayabiliriz:
replace() { exec 3<$1 ; rm $1; ${@:2} <&3 >$1 || cat <&3 >$1 ; exec 3>&- }
Misal :
$ echo aaa > test
$ replace test tr a b
$ cat test
bbb
Ayrıca, bunun orijinal dosyanın tam bir kopyasını saklayacağını unutmayın (üçüncü dosya tanımlayıcı kapanana kadar). Linux kullanıyorsanız ve üzerinde işlem yaptığınız dosya diske iki kez sığmayacak kadar büyükse , önceden işlenmiş olanın ayırmasını kaldırırken, dosyayı belirtilen komuta bloklar halinde yönlendirecek bu komut dosyasını kontrol edebilirsiniz. bloklar. Her zaman olduğu gibi kullanım sayfasındaki uyarıları okuyun.