Ваш код уже имеет багизмы. Вот, я беру их (и упрощая обработку FD для лучшей читаемости):
#!/bin/sh
while read ll <&4; do # read from output_file
printf '%s\n' "1 $ll"
while read line <&3; do # read from notify-finished
printf '%s\n' "$line"
read input # read from stdin
printf '%s\n' "$input"
done 3<notify-finished
done 4<output_file
Выполнить скрипт следующим образом:
echo "output_file" >output_file
echo "notify-finished" >notify-finished
echo "stdout" | ./yourscript
... и это правильно выходит со следующим выходом :
1 output_file
notify-finished
stdout
Примечания:
echo
Поведение на рынке POSIX небезопасно. См. Раздел ПРИМЕНЕНИЕ ИСПОЛЬЗОВАНИЯ the POSIX spec for echo
, который рекомендует вместо этого использовать printf
.
/dev/fd/##
не указан POSIX; это расширение, доступное как дистрибутивами Linux (создание символической ссылки на /proc/self/fd
- /proc
, являющееся самим неопределенным расширением), так и самим bash. Используйте <&4
вместо </dev/fd/4
.
- You вероятно хотите использовать
-r
аргумент read
- который является POSIX-указания, и предотвращает поведение по умолчанию обработки обратной косой черты, как управляющие последовательности для переноса строк и символов в МФС. Без него foo\bar
читается как foobar
, таким образом, не считывая ваши данные, поскольку он действительно существует в его источниках ввода.
'/ dev/fd' является либо лимузием, либо бахизмом (bash эмулирует его на не-Linux-операционных системах, но не все оболочки), поэтому вы уже неперекрываетесь. Используйте '<& 4', а не' dev/fd/4'. –
Пожалуйста, расширьте свой код, чтобы быть MCVE, создавая 'output_file' и' notify-finished', поэтому он будет работать таким образом, чтобы он успешно демонстрировал вашу ошибку без человека, который хочет увидеть вашу проблему, которая должна что-то сделать. –
@CharlesDuffy Оказалось, что это была нотация ' dev/fd/4', которая вызывала проблемы. Если вы повторите этот комментарий в качестве ответа, я приму его. Спасибо. –