Вместо подстановки процесса используйте fifo с фоновым процессом.
fifo=$(mktemp -u)
mkfifo "$fifo"
{
command2 <"$fifo" &
command1 | tee "$fifo" | command3
wait
} | command4
Пример, протестированный на busybox на alpine linux в docker:
f() { sed 's/^/'"$1"' /'; } ;
fifo=$(mktemp -u); mkfifo "$fifo";
{ f 2 <"$fifo" & seq 3 | tee "$fifo" | f 3; wait; } | f 4;
rm "$fifo";
выдаст:
4 3 1
4 3 2
4 3 3
4 2 1
4 2 2
4 2 3