Я немного новичок в написании сценариев bash, и мне интересно, есть ли программа или встроенная команда для передачи, которая будет печатать в указанном цвете? Или для этого есть аргумент эха?
Как я мог бы сделать:
echo Hi | commandhere -arguement blue
и он напечатал бы «Привет» синим цветом?
Я использую этот старый сценарий, hilite.pl имен, взятый от сети, уже с "неизвестным автором" строка!
#!/usr/bin/perl -w
### Usage: hilite <ansi command> <target string>
### Purpose: Will read text from standard input and perform specified highlighting
### command before displaying text to standard output.
### License: GNU GPL
# unknown author
$|=1; # don't buffer i/o
$command = "$ARGV[0]";
$target = "$ARGV[1]";
$color = "\e[" . $command . "m";
$end = "\e[0m";
while(<STDIN>) {
s/($target)/$color$1$end/;
print $_;
}
Затем я могу использовать его в каналах, к выводу журнала "hilite" или другим вещам, с помощью regexp/PCRE:
echo 'hello color world!!' | hilite.pl 34 "[Hh]el[^ ]*" | hilite.pl 43 .orld | hilite.pl 32 "\scolor\s"
Это нарисует привет в синем, раскрасит зеленый и мир в желтом фоне
Вы видите список цветов с (можно развернуть выражение удара до {01.. 255}, если Вы хотите):
for i in {01..10} {30..49} {90..110} ; do echo $i | hilite.pl $i $i ; done
Я наткнулся на этот вопрос/ответы, пытаясь сделать что-то похожее на OP. Я нашел несколько других полезных ресурсов и на их основе создал сценарий журнала. Публикация здесь, если это может помочь другим.
Копание в ссылках помогает понять некоторые перенаправления, которые я не буду пытаться объяснять, потому что я только начинаю понимать это сам.
Usage будет отображать раскрашенный вывод на консоль, удаляя цветовые коды из текста, поступающего в файл журнала. Он также будет включать stderr в файл журнала для любых команд, которые не работают.
Редактировать: внизу добавлено больше вариантов использования, чтобы показать, как вести журнал разными способами
#!/bin/bash
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
. $DIR/dev.conf
. $DIR/colors.cfg
filename=$(basename ${BASH_SOURCE[0]})
# remove extension
# filename=`echo $filename | grep -oP '.*?(?=\.)'`
filename=`echo $filename | awk -F\. '{print $1}'`
log=$DIR/logs/$filename-$target
if [ -f $log ]; then
cp $log "$log.bak"
fi
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$log 2>&1
# log message
log(){
local m="$@"
echo -e "*** ${m} ***" >&3
echo "=================================================================================" >&3
local r="$@"
echo "================================================================================="
echo -e "*** $r ***" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"
echo "================================================================================="
}
echo "=================================================================================" >&3
log "${Cyan}The ${Yellow}${COMPOSE_PROJECT_NAME} ${filename} ${Cyan}script has been executed${NC}"
log $(ls) #log $(<command>)
log "${Green}Apply tag to image $source with version $version${NC}"
# log $(exec docker tag $source $target 3>&2) #prints error only to console
# log $(docker tag $source $target 2>&1) #prints error to both but doesn't exit on fail
log $(docker tag $source $target 2>&1) && exit $? #prints error to both AND exits on fail
# docker tag $source $target 2>&1 | tee $log # prints gibberish to log
echo $? # prints 0 because log function was successful
log "${Purple}Push $target to acr${NC}"
Вот другие полезные ссылки: