Для точки 3, если мы определим:
$ d(){ printf '%7s %7s %s\n' "$BASHPID" "$1" $(date -u +'%H:%M:%S'); }
$ p1(){ d START; readarray -t a; printf '%s\n' "${a[@]}" ; sleep 2; d END; }
$ p2(){ d START; sleep 2; d END; }
Затем это:
$ p1 < <(p2)
Напечатает:
8517 START 20:31:38
11764 START 20:31:38
11764 END 20:31:40
8517 END 20:31:42
Это означает, что оба начинаются вместе, но p1 должен дождаться завершения p2, чтобы закрыть чтение, тогда он спать и кончает.
Вкратце: они работают одновременно.