Первый ответ на этот вопрос должен ... ответить на все, что вам нужно знать.
Цветной текст достаточно прост: прочитайте каждую строку и эхо его с соответствующими 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 ... но, надеюсь, этого маленького сценария оболочки достаточно для удовлетворения ваших потребностей.
На основе обертки andrewdotn
Изменения:
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