関数のリダイレクトエラー[閉じる]

関数のリダイレクトエラー[閉じる]

以下のコードが機能せず、エラーが発生する理由を特定しようとしています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>"

このスクリプトは意味があります。

実際に問題を再現するには、質問を編集してください。

関連情報