Есть ли способ заставить сообщения bash отображать stderr красным цветом?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
работает для bash и zsh. Не могу добавить это как ответ б / у репутации.
Есть ли способ заставить сообщения bash отображать stderr красным цветом?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
работает для bash и zsh. Не могу добавить это как ответ б / у репутации.
Ответы:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&2
прямо перед тем ; done)
, вывод, предназначенный для stderr, фактически записывается в stderr. Это полезно, если вы хотите захватить нормальный вывод программы.
tput
, и немного более читабельное по моему мнению:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line
должен помочь, но не помогает. Не уверен почему.
Метод 1: Используйте процесс замены:
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
Способ 2: создать функцию в скрипте bash:
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
Используйте это так:
$ color command
Оба метода покажут команду stderr
красным цветом.
Продолжайте читать, чтобы объяснить, как работает метод 2. Эта команда демонстрирует некоторые интересные особенности.
color()...
- Создает функцию bash с именем color.set -o pipefail
- Это опция оболочки, которая сохраняет код возврата ошибки команды, вывод которой передается в другую команду. Это делается в подоболочке, которая создается в скобках, чтобы не изменять параметр pipefail во внешней оболочке. "$@"
- Выполняет аргументы функции как новую команду. "$@"
эквивалентно"$1" "$2" ...
2>&1
- Перенаправляет stderr
команду stdout
так, чтобы она стала sed
's stdin
.>&3
- Сокращение для 1>&3
, это перенаправляет stdout
к новому временному дескриптору файла 3
. 3
возвращается в stdout
будущее.sed ...
- Из-за перенаправлений выше, sed
's stdin
является stderr
из выполненной команды. Его функция заключается в том, чтобы окружать каждую строку цветовыми кодами.$'...'
Конструкция bash, которая заставляет его понимать символы с обратной косой чертой.*
- Соответствует всей линии.\e[31m
- escape-последовательность ANSI, которая заставляет следующие символы быть красными&
- Символ sed
замены, который раскрывается до всей совпадающей строки (в данном случае всей строки).\e[m
- escape-последовательность ANSI, которая сбрасывает цвет.>&2
- стенография для 1>&2
, это перенаправляет sed
«s stdout
к stderr
.3>&1
- Перенаправляет дескриптор временного файла 3
обратно в stdout
.zsh
?
zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
Вы также можете проверить stderred: https://github.com/sickill/stderred
.bashrc
). Спасибо хоть!
Bash способ сделать stderr постоянно красным - использовать exec для перенаправления потоков. Добавьте следующее в ваш bashrc:
exec 9>&2
exec 8> >(
while IFS='' read -r line || [ -n "$line" ]; do
echo -e "\033[31m${line}\033[0m"
done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'
Я уже писал об этом ранее: Как установить цвет шрифта для STDOUT и STDERR
source ~/.bashrc
дважды с этим, мой терминал в основном блокируется.
Я сделал скрипт-обертку, который реализует ответ Balázs Pozsár на чистом bash. Сохраните его в ваших командах $ PATH и префиксе, чтобы раскрасить их вывод.
#! / Bin / Баш if [$ 1 == "--help"]; тогда echo "Выполняет команду и раскрашивает все возникшие ошибки" echo "Пример:` basename $ {0} `wget ..." echo "(c) o_O Tync, ICQ # 1227-700, наслаждайтесь!" выход 0 фи # Временной файл для перехвата всех ошибок TMP_ERRS = $ (Mktemp) # Выполнить команду "$ @" 2>> (во время чтения строки; выполните echo -e "\ e [01; 31m $ line \ e [0m" | tee --append $ TMP_ERRS; готово) EXIT_CODE = $? # Показать все ошибки снова if [-s "$ TMP_ERRS"]; тогда echo -e "\ n \ n \ n \ e [01; 31m === ОШИБКИ === \ e [0m" кошка $ TMP_ERRS фи rm -f $ TMP_ERRS # Конец выйти из $ EXIT_CODE
Вы можете использовать такую функцию
#!/bin/sh
color() {
printf '\033[%sm%s\033[m\n' "$@"
# usage color "31;5" "string"
# 0 default
# 5 blink, 1 strong, 4 underlined
# fg: 31 red, 32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
# bg: 40 black, 41 red, 44 blue, 45 purple
}
string="Hello world!"
color '31;1' "$string" >&2
Я добавляю> & 2 для печати в stderr
У меня есть слегка измененная версия сценария О_о Тюнка. Мне нужно было сделать эти моды для OS X Lion, и они не идеальны, потому что сценарий иногда завершается раньше, чем обернутая команда. Я добавил сон, но я уверен, что есть лучший способ.
#!/bin/bash
if [ $1 == "--help" ] ; then
echo "Executes a command and colorizes all errors occured"
echo "Example: `basename ${0}` wget ..."
echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
exit 0
fi
# Temp file to catch all errors
TMP_ERRS=`mktemp /tmp/temperr.XXXXXX` || exit 1
# Execute command
"$@" 2> >(while read line; do echo -e "$(tput setaf 1)$line\n" | tee -a $TMP_ERRS; done)
EXIT_CODE=$?
sleep 1
# Display all errors again
if [ -s "$TMP_ERRS" ] ; then
echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
cat $TMP_ERRS
else
echo "No errors collected in $TMP_ERRS"
fi
rm -f $TMP_ERRS
# Finish
exit $EXIT_CODE
Это решение сработало для меня: https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr
Я поместил эту функцию в мой .bashrc
или .zshrc
:
# Red STDERR
# rse <command string>
function rse()
{
# We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
# Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}
Тогда, например:
$ rse cat non_existing_file.txt
даст мне красный вывод.
set -o pipefail;
ранее (eval
для кода выхода перенаправления
"
eval для сохранения пробелов в аргументах
используя xargs и printf:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)