爲什麼這個命令(創建一個空文件夾,改變它,觸摸一個文件,調用ls
,然後cat
),顯示兩個文件?有趣的bash行爲
[email protected]:~# mkdir a ; cd a ; touch b ; ls > c ; cat c
b
c
我相信我應該只得到「b」。
爲什麼這個命令(創建一個空文件夾,改變它,觸摸一個文件,調用ls
,然後cat
),顯示兩個文件?有趣的bash行爲
[email protected]:~# mkdir a ; cd a ; touch b ; ls > c ; cat c
b
c
我相信我應該只得到「b」。
當您重定向的ls
輸出到文件c
,這是一個雞和蛋的問題:
如果c
將無法創建前期,這將意味着殼將需要存儲在緩衝區中的輸出和(最後)將該緩衝區寫入文件。
由於在許多情況下(由於內存管理,在完成之前被中斷的命令的失敗管理等),這不是最好的方法,所以文件被預先創建。
因此,該命令的標準輸出可以用新創建的文件替換,命令輸出可以是流式傳輸到該文件。
Costi,謝謝你的回答:) –
該文件被創建(或截斷),因此ls
的輸出可以重定向到它。
因此,ls
看到該文件。
標準輸出該命令
ls > c
重定向創建命令ls
執行之前爲c
文件句柄。 touch b
(和b
的可見性是紅鯡魚)。例如,
mkdir t ; cd t ; ls > a ; cat a
將顯示a
(因爲的>
創建a
之前ls
是exec
d)。
瞭解ls
的輸出正被重定向到文件c,我們需要看看shell用來執行此命令的過程。
當命令行(非常簡化的)外殼工藝:
由於需要在步驟3中設置輸出,任何將接收輸出的文件都必須存在,或者如果該文件不存在,則必須創建。
然後,在執行命令(在這種情況下是ls)時,文件(在這種情況下爲c)必須已經存在才能接收命令輸出。
因此,看到文件c的內容中列出的兩個文件是正確的。
@ElliottFrisch「你能解釋一下爲什麼」 – sehe
@ElliottFrisch這個問題似乎是*「爲什麼這個命令顯示兩個文件?」*。我編輯了這篇文章,以適當地關閉該palenthesis。 –