Цвет и количество появлений ключевых слов в выходных данных команды, запущенной в консоли Cygwin Bash - PullRequest
0 голосов
/ 06 ноября 2019

Я использую Cygwin (версия 4.3.46) и хочу добиться следующего:

  1. В любой запущенной команде я хочу иметь возможность выделить вхождения ключевого слова 'warning' с помощьюжелтый и вхождения ключевого слова «error» с красным.
  2. Ключевое слово «warning» и «error» может иметь любой регистр. Например: Предупреждение, ПРЕДУПРЕЖДЕНИЕ, предупреждение. Ошибка, ОШИБКА, ошибка. Поэтому мне нужен механизм, включающий регулярное выражение для сопоставления всех этих.
  3. После выполнения команды я хочу показать количество ключевых слов 'warning' и 'error', которые были отображены и раскрашены.

Для 1 и 2 я передал команду sed.

Я запускаю команду, которую хочу выполнить следующим образом:

$ time 'command_to_execute' 'command_parameters'

Код, который я использую ниже:

alias time='Util_GetExecutionTime'

function Util_GetExecutionTime()
{
    # Reset bash seconds counter
    SECONDS=0
    # Execute the command received as parameter, together with it's parameters
    if [ $GS_COLOR_WARNINGS_ERRORS == "On" ]; then
        "$@" | we red "ERROR " | we red "error" | we red "Error" | we yellow "WARNING " | we yellow "warning" | we yellow "Warning"
    else
        "$@"
    fi
    # Get the return code for the latest executed command
    rc=$?
    # Print execution time
    echo ""
    if [ "$rc" == "0" ];then
        echo -e "${BLightGreen}Command successfully executed in $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec${NC}"
    else
        echo -e "${BRed}Command executed with errors in $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec${NC}"
    fi
    # Return the Return status of the executed command
    return $rc
}

# Function for coloring the warnings and errors during test generation
function we() 
{
    declare -A fg_color_map
    fg_color_map[red]=31
    fg_color_map[yellow]=33

    fg_c=$(echo -e "\e[1;${fg_color_map[$1]}m")
    c_rs=$'\e[0m'
    sed -u s"/$2/$fg_c\0$c_rs/g"
}

Одна вещь, которая расстраивает, - то, что этот механизм (для пункта 1 и 2) работает, но не всегда. Очень часто, после того, как я запускаю команду, консоль зависает и через некоторое время начинает отображать сообщения типа: «fork: Resource временно недоступен».

Для пункта 3 я понятия не имею, как его реализовать. Любая идея будет очень кстати.

...