Bash
文件描述符是否優化了對文件的寫入?
是否相當於將命令直接列印到文件,而不是寫入文件描述符?
插圖
直接寫入文件:
for i in {1..1000}; do >>x echo "$i"; done
使用 fd:
exec 3>&1 1>x for i in {1..1000}; do echo "$i"; done exec 1>&3 3>&-
後一種效率更高嗎?
使用 循環之前打開文件和將重定向放在循環中的命令之間的主要區別在於
exec
前者只需要設置一次文件描述符,而後者在循環的每次迭代中打開和關閉文件。執行一次可能會更有效,但如果您要在循環內執行外部命令,則啟動命令的成本可能會消失。(
echo
這裡可能是內置的,所以不適用)如果輸出將被發送到正常文件以外的其他文件(例如,如果
x
是命名管道),則打開和關閉文件的行為可能對其他程序可見,因此行為上也可能存在差異。請注意,通過命令重定向和重定向之間實際上沒有區別
exec
,它們都打開文件並處理文件描述符編號。這兩個應該幾乎是等價的,因為它們既是
open()
文件又是文件write()
。(不過,在命令執行期間儲存 fd 1 的方式有所不同。):for i in {1..1000}; do >>x echo "$i" done for i in {1..1000}; do exec 3>&1 1>>x # assuming fd 3 is available echo "$i" # here, fd 3 is visible to the command exec 1>&3 3>&- done