Это очень глупая цепочка перенаправления, которую вы собрали вместе. Я не понимаю, что вы на самом деле пытаетесь сделать, но вы определенно неправильно истолковали источник вашей проблемы. Возможно, это натолкнет вас на мысль:
[mikeserv@desktop top]$ > >(sed 's/^/hey there:\t/') 2> >(ls -l /dev/fd/*)
ls: cannot access /dev/fd/10: No such file or directory
ls: cannot access /dev/fd/255: No such file or directory
ls: cannot access /dev/fd/3: No such file or directory
hey there: lr-x------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/0 -> pipe:[10484689]
hey there: l-wx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/1 -> pipe:[10484688]
hey there: lrwx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/2 -> /dev/pts/3
hey there: l-wx------ 1 mikeserv mikeserv 64 Oct 17 06:38 /dev/fd/63 -> pipe:[10484688]
Конечно, echo
не записывается в stdout цикла while
- вы заменяете его в этой команде на любой pipe command1
read, когда делаете:
> >(command1) 2> >(command2)
Перенаправления обрабатываются в порядке - слева направо для каждой команды. И каждая из тех замен процесса, которые вы делаете, все они влияют на одну и ту же команду.
Я готов поспорить, что то, что вы на самом деле пытаетесь сделать, гораздо ближе к:
command0 | command1 2>&1 >/dev/null | command2