Bash

重定向中的文件描述符重複

  • April 16, 2022

來自 GNU Bash 參考手冊,第 3.6 節重定向

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 已經打開,則可能會關閉它(這不會對您的父程序做任何事情,因為這發生在一個forked off 子程序中(如果它沒有(在 shell 函式上的重定向)在某些情況下),shell 會讓它看起來好像是這樣))。

當你這樣做時:

1<someFile

它會open someFile在一個新的文件描述符上(這就是open系統呼叫通常所做的),然後它會dup2將該文件描述符放到 1 上。

手冊上說的是,如果列出的特殊開發文件之一代替someFile,shell 將跳過open-on-a-new-fd 步驟,而是直接轉到dup2匹配的文件描述符(即 /dev/ 為 1 stdout 等)到目標(重定向左側的文件描述符)上。

引用自:https://unix.stackexchange.com/questions/248012