2013-12-16 77 views
1

我試過以下命令$cat <text> text其中text是一個非空文件。 沒有輸出到標準輸出,文件text變爲空白。我期望cat命令讀取文件文本並將內容輸出到同一個文件。cat命令:意外輸出

但是,當我嘗試$cat <text> newtext它的作品! newtexttext的副本。

另一個疑問,當我嘗試$cat <text>>text其中>>通常附加到一個文件。我的終端卡在一個無限循環中,文件text重複附加到自身。爲什麼會發生?

+0

你有這樣做的特別原因嗎? – Thibault

+0

沒有特別的理由。 – Ajax

回答

4

您不能使用與stdin和stdout相同的文件。爲什麼?因爲所有命令都是同時執行的,並且shell在執行命令之前準備重定向。因此,輸出文件在執行前清空。

相反,您必須使用臨時文件。

一種解決方法可能是您的解決方案或也:

cat text > newtext && mv newtext text 
2

當您重定向輸出到一個文件

echo "something" > file.txt 

這種情況發生的第一件事情,就是你的文件被創建(重新)。如果存在,它將被清空,這正是你所看到的。

你可以通過簡單地調用

cat file.txt 

達到你已經試過什麼顯示文件的內容,你可以做

cat file.txt > temp.txt && mv temp.txt file.txt 

,但我不明白了一個道理,爲什麼你會想要這樣做。

1

如果你仔細想想具有先做重定向的外殼。如果shell實際上執行了從左到右的命令,那麼cat file會將文件內容顯示到終端,然後shell會看到> file並且必須回滾,即清除終端的輸出並重新運行帶有stdout重定向。

這顯然所以當殼解析您的命令沒有意義的重定向必須做到第一,因爲>覆蓋的內容文件是clobbered它讀之前它是空的!