удар: распечатайте stderr в красном цвете

Как другие упомянули, если они общедоступны и не требуют проходящих проверку подлинности пользователей против каталога, то не помещайте их в домен.

Однако, если Вы требуете своего рода аутентификации или поиска информации от AD, возможно изучаете рабочий Режим приложения Active Directory (ADAM) в демилитаризованной зоне. Вы, возможно, должны копировать relavent информацию от AD в Раздел Applicaton, поскольку ADAM не синхронизирует стандартные AD разделы.

Если Вы просто ищете функции управления, хотя, ADAM не применяется.

124
задан 9 December 2009 в 12:07
11 ответов
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
100
ответ дан 28 November 2019 в 19:19
  • 1
    Отлично! Но я задаюсь вопросом если there' s способ сделать это постоянным :) –  kolypto 27 August 2009 в 00:47
  • 2
    Я думаю, выполняя 2 процесса tput для каждой выходной строки, не изящно вообще. Возможно, если Вы сохранили бы вывод команд tput в переменной и использовали бы команды для каждого эха. Но с другой стороны, удобочитаемость не действительно лучше. –  Balázs Pozsár 7 October 2014 в 15:09
14
ответ дан 28 November 2019 в 19:19

Я сделал сценарий обертки, который реализует ответ Balázs Pozsár в чистом ударе. Сохраните его в своем $PATH и командах префикса к colorize их вывод.


    #!/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)

    # Execute command
    "$@" 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" | tee --append $TMP_ERRS; done)
    EXIT_CODE=$?

    # Display all errors again
    if [ -s "$TMP_ERRS" ] ; then
        echo -e "\n\n\n\e[01;31m === ERRORS === \e[0m"
        cat $TMP_ERRS
        fi
    rm -f $TMP_ERRS

    # Finish
    exit $EXIT_CODE

7
ответ дан 28 November 2019 в 19:19
  • 1
    Это могло быть сделано более эффективным если " |tee..." был помещен после " done". –  Juliano 27 August 2009 в 04:27

Можно использовать функцию как это


 #!/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

3
ответ дан 28 November 2019 в 19:19
  • 1
    Не рассмотрение проблемы. Вы haven' t дал возможность разделения stderr от stdout, который является тем, чем интересуется O.P. –  Jeremy Visser 27 August 2009 в 04:54

Вы также можете проверить stderred: https://github.com/sickill/stderred

26
ответ дан 28 November 2019 в 19:19

У меня есть немного измененная версия скрипта 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
1
ответ дан 28 November 2019 в 19:19

Метод 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 во внешней оболочке.
  • " $ @" - Выполняет аргументы функции как новую команду. " $ @* - соответствует всей строке.
  • \ e [31m - escape-последовательность ANSI, из-за которой следующие символы становятся красными
  • & - sed replace символ, который расширяется до всей совпавшей строки (в данном случае до всей строки).
  • \ e [m - Управляющая последовательность ANSI, сбрасывающая цвет.
  • > & 2 - Сокращение для ] 1> & 2 , это перенаправляет sed stdout на stderr .
  • 3> & 1 - Перенаправляет дескриптор временного файла 3 обратно в stdout .
89
ответ дан 28 November 2019 в 19:19

Способ 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

15
ответ дан 28 November 2019 в 19:19

Это решение сработало для меня: https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr

I Я поместил эту функцию в мой .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

даст мне красный вывод.

1
ответ дан 28 November 2019 в 19:19

версия, использующая fifos

mkfifo errs
stdbuf -o0 -e0 -i0 grep . foo | while read line; do echo -e "\e[01;31m$line  \e[0m" >&2; done &
stdbuf -o0 -e0 -i0 sh $script 2>errs
0
ответ дан 28 November 2019 в 19:19

с использованием xargs и printf:

command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)
1
ответ дан 28 November 2019 в 19:19

Теги

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