Могу ли я указать перенаправленный вход перед составной командой?

Bash позволяет указать перенаправленный вход перед командой:

$ <lines sed 's/^/line: /g' line: foo line: bar 

Bash также позволяет перенаправлять ввод на составную команду, как цикл while:

 $ while read line; do echo "line: $line"; done <lines line: foo line: bar 

Однако, когда я пытаюсь указать перенаправленный вход перед циклом while, я получаю синтаксическую ошибку:

 $ <lines while read line; do echo "line: $line"; done bash: syntax error near unexpected token `do' 

Что случилось с этим? Невозможно ли указать перенаправленный вход перед составной командой в Bash? Если да, почему бы и нет?

4 Solutions collect form web for “Могу ли я указать перенаправленный вход перед составной командой?”

man bash говорит:

… операторы перенаправления могут предшествовать или появляться где угодно в простой команде или могут следовать за командой.

while не простая команда.

Вы можете в zsh , а не в bash и choroba уже указал вам на документацию , но если вы хотите перенаправлять раньше, вы можете делать такие вещи, как:

 < file eval ' while IFS= read -r line; do ... done' 

Или (в системах с поддержкой /dev/fd/n ):

 < file 3<< 'EOF' . /dev/fd/3 while IFS= read -r line; do ... done EOF 

(не это вы хотели бы сделать).

Вы также можете сделать:

 exec 3< file while IFS= read -r line <&3; do ... done exec 3<&- 

(обратите внимание, что exec выйдет из сценария, если file не может быть открыт).

Или используйте функцию:

 process() while IFS= read -r line; do ... done < file process 

Вы можете использовать эту подстановку, если вы хотите предшествовать вводу:

 cat lines | while read line; do echo "line: $line"; done 

Вы можете использовать exec для перенаправления stdin.

В сценарии:

 exec < <(cat lines) while read line ; do echo "line: $line"; done 

Вы не можете использовать в оболочке входа, хотя (он выгрузит файл на stdout и выйдет). В этом случае вы можете открыть другой файловый дескриптор:

 exec 3< <(cat lines) while read -u 3 line ; do echo "line: $line"; done 

Для справки: Использование exec

  • Почему многие команды предоставляют «тихий» вариант?
  • cd к предыдущим каталогам
  • Что такое «& >>» в bash?
  • Не могу понять, как вернуться к резервному файлу профиля
  • Что означает амперсанд в конце строки сценария оболочки?
  • Есть ли общая команда для просмотра оболочки?
  • Как перейти от csh к bash в качестве оболочки по умолчанию
  • Как использовать `which` в команде aliased?
  • Понимание переменных окружающей среды в разных контекстах
  • bash while loop не печатает, что ожидается
  • ошибки времени выполнения, откуда они взялись?
  • Interesting Posts

    Почему файл rc.status устанавливает локаль LC_ALL

    Невозможно установить Flash-плеер после добавления несвободных репозиториев

    Возможно ли создать среду Linux без традиционной командной оболочки?

    Невозможно убить процесс sar

    Как примусрун отличается от optirun

    Как я могу добавить пакет к установке Ubuntu по умолчанию?

    Как узнать, включена ли поддержка многоадресной рассылки IP

    Записывайте нажатия клавиш через ssh и сможете воспроизводить их

    Как проверить, что установка Apache Server работает?

    Как отслеживать, был ли файл создан?

    Создайте интерфейс loopback и сделайте его постоянным (FreeBSD)

    Необходимо настроить сетевую карту вручную после каждой перезагрузки

    Должен ли я изменить разрешения двоичных файлов?

    Ubuntu загружается после GRUB (пустой экран), но работает после горячей перезагрузки Windows

    Как изменить стандартную IP-маршрутизацию для определенного сетевого интерфейса

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