В чем разница между использованием именованного файла канала с помощью cat и read и почему последний завершается неудачей с «Прерванным системным вызовом»?

#bash #shell #pipe #named-pipes #io-redirection

#bash #оболочка #канал #именованные каналы #перенаправление ввода-вывода

Вопрос:

Я пишу асинхронные задачи в сценарии оболочки и координирую их с каналом канала для отображения на экране того, что происходит (и многое другое).

Что-то вроде этого:

 long_task1 | very_long_task2 | other_long_task3 amp;

reporter_task
  

long_task1 very_long_task2 и other_long_task3 записывает их статус и прогресс в именованном вызываемом channel.pipe канале. reporter_task потребляет channel.pipe отображение на экране некоторой информации для пользователя.

Если я реализую reporter_task так

 cat 'channel.pipe' | while IFS= read -r msg; do
    # code
done
  

все работает нормально, но если я реализую это таким образом

 while IFS= read -r msg; do
    # code
done < channel.pipe
  

он завершается Interrupted system call ошибкой с сообщением об ошибке.

Почему использование последнего синтаксиса приводит к прерыванию канала?

Комментарии:

1. Я думаю, что ваша операционная система и bash версия будут актуальны. Для меня это похоже на ошибку.