2010-02-15 2 views
2

У меня есть bashscript, который порождает процессы на двух разных машинах по ssh, а затем cat выводит один в текстовый файл. Как я могу отображать вывод ALSO в терминале, когда он работает?pipe bash output to two different streams

ответ

6

Посмотрите на полезную информацию tee (man tee).

+0

И сделать это с 'tee' вы выпустить простейшую команду' выходного кота | тройником filename' – Kimvais

+0

Работала блестяще, благодаря –

+1

Не стоит забывать о стандартная ошибка: выход cat 2> & 1 | tee filename – Harvey

3

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

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

Вот демо, где строка «вход» предваряется с номером, чтобы показать, где выходы собираются, а затем отправлены в качестве входных данных для двух программ на языке 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 

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

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