Jest to bardzo możliwe, musisz tylko upewnić się, że zanim napiszesz wynik, zapisujesz go w innym pliku. Można to zrobić, usuwając plik po otwarciu do niego deskryptora pliku, ale przed zapisaniem do niego:
exec 3<file ; rm file; COMMAND <&3 >file ; exec 3>&-
Lub wiersz po wierszu, aby lepiej to zrozumieć:
exec 3<file
rm file
COMMAND <&3 >file
exec 3>&-
Jest to nadal ryzykowne, ponieważ jeśli polecenie COMMAND nie zadziała poprawnie, utracisz zawartość pliku. Można to złagodzić, przywracając plik, jeśli COMMAND zwraca niezerowy kod zakończenia:
exec 3<file ; rm file; COMMAND <&3 >file || cat <&3 >file ; exec 3>&-
Możemy również zdefiniować funkcję powłoki, aby ułatwić korzystanie z:
replace() { exec 3<$1 ; rm $1; ${@:2} <&3 >$1 || cat <&3 >$1 ; exec 3>&- }
Przykład:
$ echo aaa > test
$ replace test tr a b
$ cat test
bbb
Pamiętaj również, że zachowa to pełną kopię oryginalnego pliku (do czasu zamknięcia trzeciego deskryptora pliku). Jeśli używasz Linuksa, a plik, na którym przetwarzasz, jest zbyt duży, aby zmieścić się dwukrotnie na dysku, możesz sprawdzić ten skrypt , który przekieruje plik do określonego polecenia blok po bloku, jednocześnie usuwając przydział już przetworzonego Bloki. Jak zawsze przeczytaj ostrzeżenia na stronie użytkowania.