Во-первых, что не может работать в вашем скрипте:
exec 3>&${test[0]}
В результате coproc ${test[0]}
представляет собой файловый дескриптор, предназначенный для чтения, а не для записи. Предполагая, что вы имеете в виду3<&${test[0]}
input <&3 &>4 &
Во-первых, &>4
означает «перенаправить stdout и stderr в файл с именем 4», вы, вероятно, имеете в виду >&4
. Так как FD #4 является входом test
coproc (, который не считывается тестом BTW ), перенаправление не имеет особого смысла.
output <&4 &
Если бы не опечатка, FD #4 был бы дескриптором выходного файла (, привязанным к стандартному вводу coproc ), вы не можете читать из него.
Теперь я постараюсь дать вам рабочий код, если вы хотите:
input
, который читает из FD #3 и отправляет все в output
с добавлением «отправлено» к каждой строке. output
, который читает все, что input
отправляет, добавляет перед словом «получено», выполняет некоторую обработку строк и записывает результат в стандартный вывод Обычно это было бы так просто:
test() for i in {0..9}; do sleep 1; echo $i; done # No coproc
input() while read gr; do echo sent: $gr; done # Reads from stdin, not FD #3
# output() unmodified
exec 3> >(input | output)
test >&3
Но у меня сложилось впечатление, что по какой-то причине вы хотите создать input
и output
отдельно и поместить test
в фоновом режиме. Тогда попробуйте это:
exec 4> >(output)
output_PID=$!
exec 3> >(input >&4)
input_PID=$!
exec 4>&-
test >&3 &
wait
Я исправил! Виновата была память... или что-то с памятью.
И да -Я тестировал его раньше (Memtest был одним из первых средств диагностики, которые я запускал ). Но он не сообщил о каких-либо проблемах. Но несколько дней назад я удалил один из модулей оперативной памяти (, там было 2 x 4 ГБ ). После этого (на 4 ГБ )проблем больше не было. Я поменял оба модуля и теперь у меня снова 8GB (2x4GB ). Еще несколько дней нормально работает. Я также снова протестировал модули с помощью memtest, никаких проблем, как раньше.
Интересное поведение при проблеме с оперативной памятью. Я надеюсь, что кто-то с той же проблемой наткнется на этот ответ.