Использовать подстановку процесса - отправлять только stderr в файл - PullRequest
0 голосов
/ 08 мая 2018

По какой-то причине кажется, что stderr отправляется на стандартный вывод в следующем скрипте bash:

exec > >( while read line; do echo " stdout: $line"; done )
exec 2> >( while read line; do echo " stderr: $line"; done )

echo "rolo"
echo "cholo" >&2

если вы запустите это, вывод будет таким:

стандартный вывод: rolo
stdout: stderr: cholo

Кто-нибудь знает, почему это происходит? Насколько я могу судить, происходит то, что stderr отправляется на стандартный вывод, поэтому первая строка захватывает выходные данные второй строки?

1 Ответ

0 голосов
/ 08 мая 2018

Да - ваша стандартная ошибка отправляется на стандартный вывод. Это то, что вы просили, чтобы это произошло.

Ваш сценарий exec 2> >(…) повторяется на stdout, поэтому сценарий exec > >(…) тоже может это увидеть - поэтому у вас есть и теги stdout и stderr в строке вывода cholo.

Пересмотрите ваш скрипт (bash17.sh) до:

exec  > >( while read line; do echo " stdout: $line"; done     )
exec 2> >( while read line; do echo " stderr: $line"; done >&2 )

echo "rolo"
echo "cholo" >&2

так что стандартная ошибка переходит к стандартной ошибке, и вы видите:

$ bash bash17.sh
 stdout: rolo
 stderr: cholo
$ bash bash17.sh > /dev/null
 stderr: cholo
$ bash bash17.sh 2> /dev/null
 stdout: rolo
$

Очевидно, что для получения стандартной ошибки в файле вы должны использовать альтернативное перенаправление внутри компонента exec 2> >(…) скрипта.

...