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

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

One Solution collect form web for “Ошибка перенаправления в функции”

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

Линия

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

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

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

  • Какие новые функции доступны для bash 4?
  • Сделайте программу в трубе, думайте, что она имеет tty
  • Каковы проблемы безопасности и условия гонки при использовании `find -exec`?
  • Как установить псевдоним во всех оболочках tty?
  • Предотвращение перенаправления вывода на / dev / null
  • Как получить имя распространения и номер версии в простом сценарии оболочки?
  • shell: объединение точек с запятой и амперсанда в bash / sh
  • Что означает этот синтаксис "$ {i% .avi} .mp4"
  • В чем смысл «ln -sf» в Linux?
  • В терминале я могу выполнять поиск до конца журнала быстрее, чем данные попадают туда
  • зацикливание команды без ожидания первого запуска
  • Interesting Posts

    Как настроить dhcpd для регистрации ipv4 со связью при наличии статических адресов ipv6?

    Как установить устаревшую аутентификацию в Apache?

    Почему эта команда удаляет больше пакетов, чем я хочу?

    Как добавить два шлюза на одном компьютере

    скрипт grep restart, если он не запущен

    Как прокси-приложение через обратный SSH-туннель (несколько переходов)

    Как удалить оба дубликата из файла на основе первых двух столбцов

    Отображение клавиатуры: на самом примитивном уровне

    Виртуальная схема памяти ядра: отрицательные значения

    Изменение размера окна из командной строки

    Найти каталог, содержащий все файлы в моем списке

    установка netcdf и usr / local … папки

    Как обрабатывать ключи в сценарии оболочки?

    Смонтируйте файловую систему с помощью sshfs с помощью сервера Dropbear на прошивке Yocto

    Временно смонтированные файловые системы внезапно отключаются

    Linux и Unix - лучшая ОС в мире.