Intereting Posts
«Нет такого файла или каталога» при сравнении чисел в bash Как отслеживать пользователей, которые используют туннелирование DropBear ssh? Как скопировать открытый ключ на ssh-сервер? Неизвестное устройство LVM: как восстановить? Что означает «мышиная отчетность»? Вопросы о выпуске ядра Ошибка при использовании apt на macOS Sierra Использование аппаратного управления потоком CTS / RTS на USB Как правильно экспортировать и импортировать общие ресурсы NFS, которые также имеют подкаталоги в качестве точек монтирования? Подсказка: замените пользовательский путь коротким словом, например ~ для дома Fedora Linux: я установил sendmail, но теперь я не получаю почтовые уведомления при входе в систему Linux newbie: Как использовать Jack? Как работает Linux? Как восстановить аутентификацию для диспетчера синаптических пакетов Debian Lenny? Как установить php-fpm для пользователя php-user вместо www-data? Как заблокировать общие пароли в системах UNIX?

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

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? Если да, почему бы и нет?

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