2009-09-16 44 views
0
ls > ls.out 

這將在列表中包含ls.out。 我的理解是:>(shell輸出重定向操作符首先創建一個文件(以獲取STDOUT)(如果它尚未存在),然後ls命令即將播放,並在輸出中包含剛剛創建的ls.out文件。 這是正確的嗎?如果沒有,請您詳細闡述該命令的工作。瞭解不存在的文件上的shell重定向

同樣

wc temp > temp 

將打印0 0 0溫度剛剛創建的臨時文件內。

此行爲shell是有趣的,我想知道它是如何工作的。順便說一句,兩者都是行使的Unix編程環境手冊中的ises。正如我在上面提到的答案,我想要一些專家來糾正我的理解。

+0

有趣,也許。令人驚訝的是,沒有。您的wc temp> temp示例是要求wc描述您尚未創建的文件。還有什麼要說的? – pavium 2009-09-16 03:48:25

+0

@pavium - 問題是,如果'temp'已經存在,並且你只是搞砸了,並試圖獲得它的統計數據,你將意外覆蓋它,因此沒有統計數據。 – 2009-09-16 04:05:24

+0

@pavium:試試這兩個,看看有什麼不同。 廁所臨時 和 廁所溫度>溫度 在這兩種情況下,溫度不應該存在。 – 2009-09-16 04:26:31

回答

6

將標準輸出重定向到>時,如果文件不存在,shell將創建文件(作爲空文件)。此外,該文件在shell分支並執行正在執行的命令之前打開。當您執行wc temp > temp時,shell會打開文件進行寫入,然後分叉並執行wc,並在該進程中傳遞其打開的文件句柄。

+0

感謝您的解釋。 – 2009-09-16 06:11:09

1

簡單化:

ls正在注視哪個重定向創建的索引節點(目錄條目)。

wc可以看到重定向創建的inode,但是當它查看內容時,它們是空的,因爲它(wc)尚未寫入它們。

編輯:

首先,在這兩種情況下,重定向(>ls.out>temp)創建一個空文件。目錄中的條目(inode)指向文件的位置幷包含有關它的一些信息。請參閱維基百科有關inodes的文章。

接下來,在ls的情況下,在目錄中,所有條目,包括一個針對剛創建ls.out被讀取和寫入stdout(在這種情況下成爲ls.out內容)。

或者,在wc的情況下,它的它計算(無)後,計算換行,字和稱最近創建文件的字節數temp裏面是空的所以寫零計數到文件

文件的內容(templs.out)在所有閱讀完成後才寫入,因此不能包含它們。

對於更好的方式來比較什麼lswc都在做,試試這個命令(當ls.out是不存在的):

ls -l > ls.out 

你應該看到,ls.out文件的大小根據爲零到內部列表(cat ls.out),但如果你做ls -l ls.out你會發現它不是零。這對應於您看到wc發生的情況。

+0

丹尼斯可能會提供一些進一步的解釋。 – 2009-09-16 06:12:27

+0

謝謝你的解釋。 – 2009-09-17 12:52:07

0

考慮wc -l temp > temp

如果temp已經存在,不得不說,20日線仍然cat temp執行上述命令後的結果,這將是0溫度。

我想這是因爲shell創建一個新的空temp即使temp因此存在覆蓋現有的溫度,因此當wc試圖計算行中temp的Num它得到零。

實際上> temp由shell首先執行,然後執行wc -l temp

相關問題