我試過以下命令$cat <text> text
其中text
是一個非空文件。 沒有輸出到標準輸出,文件text
變爲空白。我期望cat命令讀取文件文本並將內容輸出到同一個文件。cat命令:意外輸出
但是,當我嘗試$cat <text> newtext
它的作品! newtext
是text
的副本。
另一個疑問,當我嘗試$cat <text>>text
其中>>
通常附加到一個文件。我的終端卡在一個無限循環中,文件text
重複附加到自身。爲什麼會發生?
我試過以下命令$cat <text> text
其中text
是一個非空文件。 沒有輸出到標準輸出,文件text
變爲空白。我期望cat命令讀取文件文本並將內容輸出到同一個文件。cat命令:意外輸出
但是,當我嘗試$cat <text> newtext
它的作品! newtext
是text
的副本。
另一個疑問,當我嘗試$cat <text>>text
其中>>
通常附加到一個文件。我的終端卡在一個無限循環中,文件text
重複附加到自身。爲什麼會發生?
您不能使用與stdin和stdout相同的文件。爲什麼?因爲所有命令都是同時執行的,並且shell在執行命令之前準備重定向。因此,輸出文件在執行前清空。
相反,您必須使用臨時文件。
一種解決方法可能是您的解決方案或也:
cat text > newtext && mv newtext text
當您重定向輸出到一個文件
echo "something" > file.txt
這種情況發生的第一件事情,就是你的文件被創建(重新)。如果存在,它將被清空,這正是你所看到的。
你可以通過簡單地調用
cat file.txt
達到你已經試過什麼顯示文件的內容,你可以做
cat file.txt > temp.txt && mv temp.txt file.txt
,但我不明白了一個道理,爲什麼你會想要這樣做。
如果你仔細想想具有先做重定向的外殼。如果shell實際上執行了從左到右的命令,那麼cat file
會將文件內容顯示到終端,然後shell會看到> file
並且必須回滾,即清除終端的輸出並重新運行帶有stdout
重定向。
這顯然所以當殼解析您的命令沒有意義的重定向必須做到第一,因爲>
覆蓋的內容文件是clobbered它讀即之前它是空的!
你有這樣做的特別原因嗎? – Thibault
沒有特別的理由。 – Ajax