Дублирование stdout в stderr - PullRequest
24 голосов
/ 29 июня 2010

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

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

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

Ответы [ 5 ]

45 голосов
/ 29 июня 2010

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

echo "FooBar" | tee /dev/stderr

или используйте awk / perl / python, чтобы вручную выполнить репликацию:

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

echo "FooBar" | perl -pe "print STDERR, $_;"
16 голосов
/ 21 сентября 2014

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

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

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

2 голосов
/ 30 апреля 2018

Если я могу развернуть @ ответ defdefred , для нескольких строк я использую

my_commmand | while read line; do echo $line; echo $line >&2; done

Он имеет «преимущество» в том, что не требует / звонит tee и использует встроенные модули.

0 голосов
/ 02 марта 2018
echo "FooBar" |tee /dev/stderr
tee: /dev/stderr: Permission denied

не работает с RedHat 6.3

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

работает

0 голосов
/ 29 июня 2010

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

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...