如果我將命令的輸出重定向到它讀取的同一個文件,其內容將被刪除。爲什麼通過I/O重定向來讀寫同一個文件會導致Unix中的空文件?
sed 's/abd/def/g' a.txt > a.txt
任何人都可以解釋爲什麼嗎?
如果我將命令的輸出重定向到它讀取的同一個文件,其內容將被刪除。爲什麼通過I/O重定向來讀寫同一個文件會導致Unix中的空文件?
sed 's/abd/def/g' a.txt > a.txt
任何人都可以解釋爲什麼嗎?
重定向確實是打開文件進行寫入的第一件事,週四清除任何現有的內容。 sed然後嘗試讀取您剛創建的這個空文件,並且什麼都不做。該文件然後關閉,不包含任何內容。
您需要使用-i
選項來編輯文件地點:
SED -i .bck的/ ABD/DEF/G'A.TXT
編輯:由尼爾指出,重定向首先打開文件進行寫入,從而清除它。
EDIT2:如果你想使用-i
一個空的擴展,以防止備份文件的創建它可能對某些讀者
在OSX是有趣的,你需要以其他方式使用-e
開關以及它失敗來解析參數正確:
的sed -e -i 'S/ABC/DEF/G' A.TXT
重定向操作<
,>
等由shell處理。當您向包含重定向的shell發出命令時,shell將首先打開該文件。在>
的情況下,文件將被打開寫入,這意味着它被截斷爲零大小。重定向文件打開後,shell會啓動一個新進程,將其標準輸入,輸出和錯誤綁定到任何可能的重定向文件,然後才執行您提供的命令。因此,當您的示例中的sed
命令開始執行時,a.txt
已被shell截斷。
順便說一句,有點切線,這也是你不能直接使用sudo
重定向的原因,因爲它是需要打開重定向文件的權限,而不是正在執行的命令。
stdout和stderr會先準備好然後stdin再執行命令。所以a.txt首先會被stdout清除,然後當comamnd執行時不會找到任何內容。 嘗試 SED -i的/ ABD/DEF/G'A.TXT 或 的sed的/ ABD/DEF/G'1 A.TXT <> A.TXT
錯誤,問題-提問者筆記一個文件被傳遞來讀取。另一個答案有正確的原因。 – 2009-12-13 09:29:20