ls -l |重定向到新檔案時 wc -l 輸出不同

ls -l |重定向到新檔案時 wc -l 輸出不同

「ls -l | wc -l」輸出「1+no.file/directories」(第一行多一個)。

但是,當我運行命令 ls -l | wc -l > temp(當輸出重新導向到新檔案 temp 時)。暫存檔案中儲存的值比未經重定向輸出的值多 1。我猜這是因為創建了新的“temp”文件,但臨時文件應該在運行 ls -l 命令之後創建,因此輸出應該與沒有重定向的輸出相同。

請有人幫忙

答案1

這是完全正常的行為。

發生的情況是 shell(sh、bash、csh、ksh 等)先讀取整個命令列。
然後建立進程、管道和重定向文件從右到左的順序然後才運行實際命令。

因此,重定向檔案 (temp) 是在執行 ls 命令之前建立的。
必須如此,因為在 wc 實際啟動之前,與「temp」關聯的檔案句柄需要可用作 wc 輸出的目標。
依序需要設定 wc 指令,然後才能將 ls 的輸出附加到將輸入為 wc 輸入的檔案句柄。

雖然一開始看起來有點不合邏輯,但當您了解 shell 建立命令序列的方式時,這就很有意義了。

答案2

shell 實際上temp在開始運行命令之前創建了文件,因此您將始終看到對temp文件進行計數。如果您不想將其計算在內,請將臨時文件放在其他位置,例如可能放在/tmp.或只是從得到的計數中減去一。

相關內容