2017-01-13 36 views
3

在bash,一旦fd是在使用中(或者作爲輸入或輸出):現有的fd是否總是被複製爲輸入和輸出?

exec 7>AFile 

似乎該FD數目可以被複制,既作爲輸入或輸出:

true <&7; echo $? 
true >&7; echo $? 

的測試可重複的變量:用一個詞加入作爲

fd=7 
rco="$(true >&${fd} 2>/dev/null; echo $?)" 
rci="$(true <&${fd} 2>/dev/null; echo $?)" 

而且兩者的出口值:

[[ "$rco$rci" = "11" ]] && echo "The fd number $fd is free" 

的問題是:

在何種條件下將的"$rco$rci"退出值爲一個「自由」 FD數目是11不同。

換句話說:有時候可能是1001

它可以在其他shell嗎?

回答

3

從來沒有。 在引擎蓋下,重定向將嘗試dup現有的或自由的文件描述符,然後如果初步重定向成功,則shell應繼續運行true

dup從未打開的描述符中讀取的內容總是會失敗,這實際上意味着在任一方向嘗試重定向都足以測試文件描述符是否打開。 (相反,dup從一個開放的描述符應該幾乎總是成功的。當你已經用完你的每進程文件描述符限制,通常是1024-4096,並且你理論上可以得到一個許可失敗,如果shell嘗試重置打開的標誌,但是破折號,bash和zsh似乎沒有嘗試這樣做。我只在實際嘗試寫入到duope readonly文件描述符時發生IO錯誤,而不是在重定向過程中)。

相關問題