我創造了這樣的關閉了一個名爲文件描述符
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
}
它看起來更像是一個進程試圖在關閉它之後從描述符中讀取而不是關閉本身的問題。 – chepner
@chepner \t 是的,但文件描述符應該仍然由'run_gui'子進程打開,因爲它是一個子shell ...請參閱更新的OP – marmistrz
然而,我認爲@chepner很可能是正確的:僅僅因爲FD問題仍然在「$ GAME_BIN」進程中打開並不意味着它仍然在試圖從中讀取的shell中打開。 –