यह बहुत संभव है, आपको बस यह सुनिश्चित करना है कि जब तक आप आउटपुट लिखते हैं, तब तक आप इसे एक अलग फाइल पर लिख रहे हैं। यह फ़ाइल डिस्क्रिप्टर को खोलने के बाद फ़ाइल को हटाकर किया जा सकता है, लेकिन इसे लिखने से पहले:
exec 3<file ; rm file; COMMAND <&3 >file ; exec 3>&-
या लाइन से लाइन, इसे बेहतर समझने के लिए:
exec 3<file # open a file descriptor reading 'file'
rm file # remove file (but fd3 will still point to the removed file)
COMMAND <&3 >file # run command, with the removed file as input
exec 3>&- # close the file descriptor
यह अभी भी एक जोखिम भरा काम है, क्योंकि अगर COMMAND ठीक से नहीं चल पाता है, तो आप फ़ाइल सामग्री खो देंगे। यदि COMMAND एक गैर-शून्य निकास कोड लौटाता है, तो फ़ाइल को पुनर्स्थापित करके इसे कम किया जा सकता है:
exec 3<file ; rm file; COMMAND <&3 >file || cat <&3 >file ; exec 3>&-
हम इसे उपयोग करने में आसान बनाने के लिए शेल फ़ंक्शन को भी परिभाषित कर सकते हैं:
# Usage: replace FILE COMMAND
replace() { exec 3<$1 ; rm $1; ${@:2} <&3 >$1 || cat <&3 >$1 ; exec 3>&- }
उदाहरण :
$ echo aaa > test
$ replace test tr a b
$ cat test
bbb
इसके अलावा, ध्यान दें कि यह मूल फ़ाइल की पूरी प्रतिलिपि रखेगा (जब तक कि तीसरा फ़ाइल विवरणक बंद न हो)। यदि आप लिनक्स का उपयोग कर रहे हैं, और जिस फाइल पर आप प्रोसेसिंग कर रहे हैं, वह डिस्क पर दो बार फिट होने के लिए बहुत बड़ी है, तो आप इस स्क्रिप्ट की जांच कर सकते हैं, जो पहले से ही प्रोसेस को अनलॉकेट करते हुए निर्दिष्ट कमांड ब्लॉक-बाय-ब्लॉक में फाइल को पाइप कर देगा। ब्लॉक। हमेशा की तरह, उपयोग पृष्ठ में चेतावनी पढ़ें।