2010-06-29 4 views
21

Я хотел бы иметь команду воспроизведения, реплицируемую в stderr, а также под bash. Что-то вроде:Дублирование stdout для stderr

$ echo "FooBar" (...) 
FooBar 
FooBar 
$ 

где (...) - выражение перенаправления. Это возможно?

+0

Посмотреть [Как я могу послать стандартный вывод в несколько команд?] (Http://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands) –

ответ

41

Используйте тройник с/Dev/STDERR:

echo "FooBar" | tee /dev/stderr 

или использовать AWK/Perl/Python вручную делать репликацию:

echo "FooBar" | awk '{print;print > "/dev/stderr"}' 

echo "FooBar" | perl -pe "print STDERR, $_;" 
+1

ненужная запятая после STDERR в примере perl – Znik

+0

, которая более переносима через ОС и через оболочки? 'tee/dev/stderr' или' tee> (cat> & 2) '? –

+0

Я бы поставил ставку на более кросс-платформенную совместимость, так как «/ dev/stderr» недоступен для каждого дистрибутива. – Qix

0

Для перенаправления на stderr я бы использовал >&2 или >/dev/stderr. Для тиражирования вывода я бы использовал tee. Недостатком этого является то, что временный файл необходимо:

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 
+0

неправильно. у вас есть возможность получить большой поток и полностью заполнить/tmp устройство, обычно подключенное к/root файловой системе. – Znik

+0

@Znik - '/ tmp/stdout' является лишь примером. Не стесняйтесь заменить это имя файла тем, что более уместно в вашем контексте. – mouviciel

9

Используйте процесс подстановки: http://tldp.org/LDP/abs/html/process-sub.html

echo "FooBar" | tee >(cat >&2)

Tee берет имя файла как параметр и копирует его в этот файл. С заменой процесса вы можете использовать процесс вместо имени файла >(cat), и вы можете перенаправить вывод этого процесса на stderr >(cat >&2).

+0

Это хорошее решение для операционных систем, таких как OS X, у которых нет файловой системы/proc. – Meow

-1
echo "FooBar" |tee /dev/stderr 
tee: /dev/stderr: Permission denied 

не работает с RedHat 6,3

echo "FooBar" | (read A ; echo $A ; echo $A >&2) 

работает

+0

извините, объяснение добавлено ;-) – defdefred