Нет, но можно всегда складывать все, в чем Вы нуждаетесь в одном блоке:
function XX() {
(
some
commands
here
) 2>error.log
}
Необходимо смочь заставить это работать с FIFO и каналом.
$ mkfifo fifo
$ ./pgm2 < fifo | ./pgm1 > fifo
Вход two's программы является FIFO и выводами к каналу. Программа вход является каналом и выводами к FIFO.
Предупредите хотя: это очень колоритно в целом и может зайти в тупик, если "ping/вонь" между процессами не прекрасен.
См. также этот вопрос о Переполнении стека: Как перенаправить stdout 2-го процесса назад к stdin 1-го процесса?
У Вас есть мертвая блокировка в Вашем: ./pgm1 < pipe1 > pipe2
и ./pgm2 < pipe2 > pipe1
open("pipe1", O_RDONLY)
сделанный оболочкой до выполнения pgm1
заблокируется, пока что-то еще не будет делать записи open
на том же самом канале. Пока это не будет сделано, это не сделает следующего open("pipe2", O_WRONLY)
.
То же для другого. open("pipe2", O_RDONLY)
заблокируется и потому что open("pipe2", O_WRONLY)
не будет сделан, так как другая оболочка ожидает устройства записи на pipe1
, у Вас есть мертвая блокировка.
Вы записали это
pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2
Это работало бы.
На Linux можно также записать это:
{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :