함수의 리디렉션 오류 [닫기]

함수의 리디렉션 오류 [닫기]

아래 코드가 작동하지 않고 오류가 발생하는 이유를 알아내려고 합니다 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마지막 줄에서 두 번째 줄에 오류가 발생합니다 .

여기서 무슨 일이 일어나고 있는 걸까요? 또한 스크립트의 다른 곳에서는 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>"

이 스크립트는 의미가 있습니다.

실제로 문제를 재현하려면 질문을 편집하십시오.

관련 정보