2015-07-22 4 views
4

У меня есть процесс myProcess1, который производит как выходы stdout, так и stderr. Я хочу подключить два выходных потока к двум различным нисходящим процессам: myProcess2 и myProcess3, которые будут массировать данные, а затем выгружать результаты в два разных файла. Можно ли сделать это с помощью одной команды? Если нет, второй вариант будет состоять из двух отдельных команд, один для обработки stdout, другой stderr. В этом случае, первый запуск будет просто:Bash: как мне передать stdout и stderr одного процесса на два разных процесса?

myProcess1 | myProcess2 > results-out.txt 

Что бы подобная команда для обработки stderr? Thx

ответ

2

Без фантазии игры что-то, как это должно работать:

{ myProcess1 | myProcess2 > results-out.txt; } 2>&1 | myprocess3 > results-err.txt 

С причудливых игр (которые не работают в /bin/sh и т.д.), вы могли бы сделать что-то вроде этого:

myProcess1 2> >(myprocess3 > results-err.txt) | myProcess2 > results-out.txt 
+1

Может быть, стоит упомянуть, что вторая команда требует 'bash' и не будет работать с' sh' из-за подстановки процесса. –

+0

Первый предполагает, что myProcess2 не имеет собственного выхода stderr. Если это произойдет, то оно будет объединено с stderr myProcess1 и передано в myprocess3. –

+1

Если 'myProcess2' также пишет что-то в stderr, он будет входить в' myprocess3'. Чтобы исправить это, команда должна выглядеть как '{myProcess1 2> & 3 | myProcess2> results-out.txt; } 3> & 1 | myprocess3> results-err.txt' – Roman

1

A именованный канал или два будут хорошо работать для этого, но вы, вероятно, найдете его проще всего с несколькими терминальными окнами.

В одном окне терминала:

mknod stdout.pipe p 
mknod stderr.pipe p 
myProcess1 > stdout.pipe 2> stderr.pipe 

Во втором окне:

myProcess2 < stdout.pipe 

И в-третьих:

myProcess3 < stderr.pipe 

Использование фоновых процессов и некоторые другие приемы, вы может сделать все это в одном окне, но сохранить вывод вашей второй Ry процессы отделенные бы еще одна проблема ...

Вы могли бы устранить одну из названных труб (и, таким образом, одним из дополнительных окон) с любым из них:

myProcess1 2> stderr.pipe | myProcess2 

или

{ myProcess1 > stdout.pipe; } 2>&1 | myProcess3 
Смежные вопросы