Ошибка перенаправления в функции

Я пытаюсь понять, почему приведенный ниже код не работает, и дает мне ошибку. 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 в другом месте скрипта.

С вашим вопросом есть несколько проблем.

Линия

 4>&1 1>&3 

Отсутствует exec:

 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>" 

Этот сценарий имеет смысл.

Пожалуйста, отредактируйте вопрос, чтобы реально воспроизвести вашу проблему.