2015-10-18 35 views
4

爲什麼這個命令(創建一個空文件夾,改變它,觸摸一個文件,調用ls,然後cat),顯示兩個文件?有趣的bash行爲

[email protected]:~# mkdir a ; cd a ; touch b ; ls > c ; cat c 
b 
c 

我相信我應該只得到「b」。

+1

@ElliottFrisch「你能解釋一下爲什麼」 – sehe

+2

@ElliottFrisch這個問題似乎是*「爲什麼這個命令顯示兩個文件?」*。我編輯了這篇文章,以適當地關閉該palenthesis。 –

回答

5

當您重定向的ls輸出到文件c,這是一個雞和蛋的問題:

如果c將無法​​創建前期,這將意味着殼將需要存儲在緩衝區中的輸出和(最後)將該緩衝區寫入文件。

由於在許多情況下(由於內存管理,在完成之前被中斷的命令的失敗管理等),這不是最好的方法,所以文件被預先創建。

因此,該命令的標準輸出可以用新創建的文件替換,命令輸出可以是流式傳輸到該文件。

+0

Costi,謝謝你的回答:) –

1

該文件被創建(或截斷),因此ls的輸出可以重定向到它。

因此,ls看到該文件。

3

標準輸出該命令

ls > c 

重定向創建命令ls執行之前爲c文件句柄。 touch b(和b的可見性是紅鯡魚)。例如,

mkdir t ; cd t ; ls > a ; cat a 

將顯示a因爲>創建a之前lsexec d)。

0

瞭解ls的輸出正被重定向到文件c,我們需要看看shell用來執行此命令的過程。

當命令行(非常簡化的)外殼工藝:

  1. 除以行成令牌(通常在空格)。
  2. 解釋所有標記(它們是命令,參數,重定向)。
  3. 設置輸入和輸出的結構,包括任何重定向。
  4. 執行該命令,將其輸出發送到正確的位置。

由於需要在步驟3中設置輸出,任何將接收輸出的文件都必須存在,或者如果該文件不存在,則必須創建。

然後,在執行命令(在這種情況下是ls)時,文件(在這種情況下爲c)必須已經存在才能接收命令輸出。

因此,看到文件c的內容中列出的兩個文件是正確的。