以下のコードが機能せず、エラーが発生する理由を特定しようとしていますBad file descriptor
。フォローアップです。この問題現在作成中のスクリプトで動作します。
呼び出し元の寿命の初期にexec 3>&1
実行され、次のように(一般)関数を呼び出す前に明示的に変更されることはありません。
exec 3>&1
...
string=$(GetString)
GetStringは次のようになります。
GetString()
{
4>&1 1>&3 #save pipe end and change output back to caller's
controlvar=0
while ((controlvar != 1))
do
printf "some stuff for the interactive user\n"
read -p "my prompt" variable
if ValidationFunction $variable; controlvar=1;fi #tests for valid input
done
exec 1>&4- #change output back to pipe end
echo $variable
}
Bad file descriptor
最後の行から2行目にエラーが発生します。
ここで何が起こっているのでしょうか?また、スクリプトの他の場所ではfd / 4に対して明示的な操作を実行しないことに注意してください。
答え1
あなたの質問にはいくつかの問題があります。
ライン
4>&1 1>&3
役員不足:
exec 4>&1 1>&3
そしてその行は:
exec 1>4&-
読む必要があります
exec 1>&4-
簡略化されたスクリプトは次のとおりです。
GetString()
{
exec 4>&1 1>&3 #save pipe end and change output back to caller's
printf "some stuff for the interactive user\n"
sleep 3
exec >&4- #change output back to pipe end
echo "test value"
}
exec 3>&1
string=$(GetString)
echo "final value <$string>"
このスクリプトは意味があります。
実際に問題を再現するには、質問を編集してください。