Чи є спосіб зробити башти відображати більш жорсткі повідомлення червоним кольором?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
працює на баш і зш. Неможливо додати це як відповідь репутації.
Чи є спосіб зробити башти відображати більш жорсткі повідомлення червоним кольором?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
працює на баш і зш. Неможливо додати це як відповідь репутації.
Відповіді:
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
це виконана команда. Його функція полягає в оточенні кожного рядка кольоровими кодами.$'...'
Конструктивна графіка, яка змушує його розуміти символи, що вийшли з косої риски.*
- Збігає весь рядок.\e[31m
- послідовність аварійної передачі ANSI, яка спричиняє червоний колір наступних символів&
- Символ sed
заміни, який розширюється на весь відповідний рядок (у цьому випадку весь рядок).\e[m
- послідовність аварійної передачі 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
). Дякую, хоча!
Баш спосіб перетворення 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
двічі з цим, мій термінал в основному блокується.
Я створив обгортковий сценарій, який реалізує відповідь Балаша Позара чистою душею. Збережіть це у ваших $ PATH та префіксальних командах, щоб розфарбувати їх вихід.
#! / бін / баш якщо [$ 1 == "--help"]; тоді echo "Виконує команду і розфарбовує всі виниклі помилки" echo "Приклад:` basename $ {0} `wget ..." echo "(c) o_O Tync, ICQ # 1227-700, насолоджуйтесь!" вихід 0 фі # Темп-файл, щоб знайти всі помилки TMP_ERRS = $ (mktemp) # Виконати команду "$ @" 2>> (під час читання рядка; виконайте відлуння -e "\ e [01; 31m $ line \ e [0m" | tee - додайте $ TMP_ERRS; зроблено) EXIT_CODE = $? # Показувати всі помилки ще раз якщо [-s "$ TMP_ERRS"]; тоді echo -e "\ n \ n \ n \ e [01; 31m === ПОМИЛКИ === \ e [0м" кіт $ 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
У мене є дещо змінена версія сценарію O_o Tync. Мені потрібно було зробити ці моди для 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/immediate-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)