Как я могу передать stderr и stdout в один и тот же файл, окрашивая stderr красный, но не stdout? [Дубликат]

Первый ответ на этот вопрос должен ... ответить на все, что вам нужно знать.

3
задан Robby75 22 January 2013 в 06:30
поделиться

2 ответа

Цветной текст достаточно прост: прочитайте каждую строку и эхо его с соответствующими escape-последовательностями в начале и в конце. Но цветная стандартная ошибка становится сложной, потому что стандартная ошибка не передается в каналы.

Вот один из подходов, который работает путем замены стандартной ошибки и стандартного вывода, а затем фильтрации стандартного вывода.

Вот наша тестовая команда:

#!/bin/bash

echo hi
echo 'Error!' 1>&2

И скрипт wrapper:

#!/bin/bash
(# swap stderr and stdout
 exec 3>&1 # copy stdout to fd 3
 exec 1>&2 # copy stderr to fd 1
 exec 2>&3- # move saved stdout on fd 3 over to 2
 "${@}") | while read line; do
                echo -e "\033[31m${line}\033[0m"
           done

Затем:

$ ./wrapper ./test-command
hi
Error! # <- shows up red

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

1
ответ дан andrewdotn 16 August 2018 в 02:44
поделиться

На основе обертки andrewdotn

Изменения:

  • Возвращает вывод stderr в stderr
  • Избегайте echo -e обработки содержимого в строках

wrapper

#!/bin/bash

"${@}" 2> >(
while read line; do
    echo -ne "\033[31m" 1>&2
    echo -n "${line}" 1>&2
    echo -e "\033[0m" 1>&2
done
)

Проблемы: выходные строки группируются, а не смешанные stdout / stderr

Тестовый скрипт:

#!/bin/bash

echo Hi
echo "\033[32mStuff"
echo message
echo error 1>&2
echo message
echo error 1>&2
echo message
echo error 1>&2

Выход:

Hi
\033[32mStuff
message
message
message
error # <- shows up red
error # <- shows up red
error # <- shows up red
1
ответ дан rrehbein 16 August 2018 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: