вывод трубажа на два разных потока - PullRequest
3 голосов
/ 15 февраля 2010

У меня есть bashscript, который порождает процессы на двух разных машинах через ssh, а затем выводит их в текстовый файл. Как я могу отобразить вывод ТАКЖЕ в терминале во время его работы?

Ответы [ 2 ]

6 голосов
/ 15 февраля 2010

Посмотрите на утилиту tee (man tee).

4 голосов
/ 08 января 2014

Команда tee отлично подходит, когда вы хотите сохранить поток в файл и продолжить его обработку. Однако, если вы хотите отправить stdout двум отдельным программам, вы можете использовать цикл чтения while и отобразить вывод в stdout и stderr, а затем передать stdout в одну программу и stderr в другую.

echo input | 
  while read foo; do
    echo "$foo"
    echo "$foo" >&2
  done 2> >( command1 1>&2 ) | command2

Вот демонстрационная программа, в которой перед строкой «input» ставится число, показывающее, куда направляются выходные данные, а затем отправляется в качестве ввода две perl-программы, просто добавляющие имя потока.

echo input | 
  while read foo; do
    echo "1: $foo"
    echo "2: $foo" >&2
  done 2> >( perl -wpe 's//STDERR: /;' 1>&2) | perl -wpe 's//STDOUT: /;'

вывод

STDERR: 2: input
STDOUT: 1: input

Предупреждение - функция while / read / echo может не сохранять окончания строк и двоичный текст, а длинные строки могут вызвать проблемы. Как и во многих других случаях, bash может быть не лучшим решением. Вот Perl-решение для чего угодно, кроме огромных файлов:

echo input | 
  perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2
...