Bash
重定向中的文件描述符重複
Bash 在重定向中使用時會專門處理多個文件名,如下表所述:
/dev/fd/*fd*
如果fd是一個有效的整數,則文件描述符fd是重複的。
/dev/stdin
文件描述符 0 重複。
/dev/stdout
文件描述符 1 重複。
/dev/stderr
文件描述符 2 重複。
這裡的“重複”是什麼意思?你能舉一些例子嗎?
(以上摘錄來自GNU Bash 參考手冊4.3 版,最後更新於 2014 年 2 月 2 日,適用於4.3 版。)
Bash
重定向是通過dup系列系統函式實現的。
dup
是重複的縮寫,當你這樣做時:3>&2
您將 (
dup2
) 文件描述符 2 複製到文件描述符 3 上,如果文件描述符 3 已經打開,則可能會關閉它(這不會對您的父程序做任何事情,因為這發生在一個fork
ed off 子程序中(如果它沒有(在 shell 函式上的重定向)在某些情況下),shell 會讓它看起來好像是這樣))。當你這樣做時:
1<someFile
它會
open
someFile
在一個新的文件描述符上(這就是open
系統呼叫通常所做的),然後它會dup2
將該文件描述符放到 1 上。手冊上說的是,如果列出的特殊開發文件之一代替
someFile
,shell 將跳過open
-on-a-new-fd 步驟,而是直接轉到dup2
匹配的文件描述符(即 /dev/ 為 1 stdout 等)到目標(重定向左側的文件描述符)上。