Bash
我可以在 Linux 中讀取和寫入同一個文件而不覆蓋它嗎?
可能重複:
我經常使用他們的公共DNS名稱
(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
。
有一個名為的實用程序
sponge
是moreutils套件的一部分。它正是為此目的而製作的。grep -v ec2 ~/.ssh/known_hosts | sponge ~/.ssh/known_hosts
重定向由 shell 在命令執行之前完成。這意味著 shell 被告知在
grep
有機會讀取文件之前截斷文件。如果您使用 shell 重定向,則無法解決此問題。