아래 코드가 작동하지 않고 오류가 발생하는 이유를 알아내려고 합니다 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>"
이 스크립트는 의미가 있습니다.
실제로 문제를 재현하려면 질문을 편집하십시오.