我可以在 Linux 中讀寫同一個檔案而不覆蓋它嗎?

我可以在 Linux 中讀寫同一個檔案而不覆蓋它嗎?

可能的重複:
如何使 iconv 以轉換後的輸出取代輸入檔?


我經常使用其公共 DNS 名稱( )連接到 amazon ec2 ec2-12-34-56-78.compute-1.amazonaws.com,因此我的known_hosts檔案被大量ec2條目淹沒,我永遠不會再使用。

我知道我可能可以使用sed -i就地編輯,但我想使用grep,所以我這樣做了:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/known_hosts

這會留下known_hosts一個空文件。如果我做:

grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/tmp
mv ~/.ssh/tmp ~/.ssh/known_hosts

grep那麼一切都很好,但我很困惑為什麼讀取和寫入同一個檔案會將其保留為空白,以及在使用、cat等時是否有任何解決方法。

答案1

有一個名為的實用程序,sponge它是更多實用程式套房。它就是為了這個目的而製作的。

grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts

答案2

重定向是在命令運行之前由 shell 完成的。這意味著 shell 被告知在grep有機會讀取檔案之前截斷該檔案。如果您使用 shell 重新導向,則無法解決此問題。

相關內容