关闭命名文件描述符

Closing a named file descriptor

我创建了一个这样的命名文件描述符

exec {gui_outfd}<>$gui_outpipe

现在我想关闭它:

exec {gui_outfd}>&-

这会产生

./game.sh: line 338: read: 14: invalid file descriptor: Bad file descriptor

我做错了什么?

编辑 我脚本中的第 330-357 行:

run_gui & gui_pid=$!
run_ai1 & ai1_pid=$!
exec {gui_outfd}>&-
while true; do
    echo "Started the loop"
    while true; do
        eval $(isalive2 $gui_pid $ai1_pid)
        read -u $ai1_outfd line || echo "Nothing read"
        if [[ $line ]]; then # line 338
            echo "Piping to GUI $line"
            echo "$line" >&$gui_infd
            if [[ "$line" == "END_TURN" ]]; then
                break
            fi
        fi
    done
    echo TURNCHANGED
    while true; do
        read -u $gui_outfd line || echo "nothing read"
        if [[ $line ]]; then
            echo "Piping to AI $line"
            echo "$line" >&$ai1_infd
            if [[ "$line" == "END_TURN" ]]; then
                break
            fi
        fi
    done
done

以及调用的函数:

run_gui()
{
    exec "$GAME_BIN" $args <&$gui_infd >&$gui_outfd
}

run_ai1()
{
    exec "$ai1" <&$ai1_infd >&$ai1_outfd
}

...的组合

exec {gui_outfd}>&-

... 之后没有进一步重定向或修改 $gui_outfd 由 ...

read -u $gui_outfd line || echo "nothing read"

...注定会像您描述的那样失败。

一旦一个进程关闭了一个文件描述符,除非将它与一个新的打开的文件描述相关联之后,该进程就不能再使用这个 FD。这与可能打开相同文件的任何其他进程无关,也与此类进程与关闭其 FD 的进程之间的关系无关。

在完成之前不要关闭 FD。