Расширение терминальных цветов до конца строки

У меня есть bash script, который генерирует motd. Проблема в зависимости от некоторых параметров терминала, которые я не уверен в цвете, будет расширяться до конца строки. В других случаях это не так:

например.

square

v.s.

jagged

IIRC - это обычный нормальный гном-терминал, а другой - мой tmux-термин. Поэтому мой вопрос заключается в том, как я могу получить это до 80 символов (или действительно до ширины терминала). Конечно, я могу использовать до 80 символов, но это действительно не решает проблему.

Вот фрагмент моего кода, который генерирует motd:

TC_RESET="^[[0m"                                                                
TC_SKY="^[[0;37;44m"                                                            
TC_GRD="^[[0;30;42m"                                                            
TC_TEXT="^[[38;5;203m"   

echo -n "${TC_SKY}                                                                              

... lots of printing..." 
echo -e "\n                           Welcome to Mokon Linux!                           \n"

echo -n "${TC_GRD}"                                                             
nodeinfo # Just prints the info seen below...                                                                       
echo ${TC_RESET} 

Как программно с bash изменить настройки терминала или что-то изменить цвет до конца строки?

Ответы

Ответ 1

Возможно, используйте последовательность Escape для очистки до EOL

По какой-то причине (на моем терминале MacOS!) мне нужно было только указать эту последовательность, а затем она работала для всех строк, но для полноты я перечисляю ее для всех

TC_RESET=$'\x1B[0m'
TC_SKY=$'\x1B[0;37;44m'
TC_GRD=$'\x1B[0;30;42m'
TC_TEXT=$'\x1B[38;5;203m'
CLREOL=$'\x1B[K'

echo -n "${TC_SKY}${CLREOL}"
echo -e "\n           ABC${CLREOL}\n"
echo -e "\n              DEFG${CLREOL}\n"

echo -n "${TC_GRD}"
echo -e "\n           ABC${CLREOL}\n"
echo -e "\n              DEFG${CLREOL}\n"
echo ${TC_RESET}

Ответ 2

Фильтр заполнения

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

Как вы говорите о , мое решение будет использовать bashisms (не будет работать под другой оболочкой или более старой версией bash).

  • синтаксис printf -v VAR FORM ARGS назначить varianble VAR, затем результат sprintf FORM ARGS. Этот башизм, под другим видом оболочки, вы должны заменить эту строку на TC_SPC=$(printf "%${COLUMNS}s" '')

Вы можете попробовать следующее:

... lots of printing..." 
echo -e "\n                           Welcome to Mokon Linux!                           \n"

echo -n "${TC_GRD}"

printf -v TC_SPC "%${COLUMNS}s" ''

nodeinfo |
    sed "s/$/$TC_SPC/;s/^\\(.\\{${COLUMNS}\\}\\) */\\1/" # Just prints the info seen below...

echo ${TC_RESET}

enter image description here Возможно, вам нужно правильно установить $COLUMNS:

COLUMNS=$(tput cols)

Как вы могли видеть, только результат команды, отфильтрованный sed, полностью окрашен.

вы можете

  • использовать тот же фильтр много раз:

    cmd1 | sed '...'
    cmd2 | sed '...'
    
  • или группируйте свои команды, чтобы использовать только один фильтр:

    ( cmd1 ; cmd 2 ) | sed '...'
    

Но есть проблема, если вы пытаетесь отфильтровать ouptut, содержащие escape-последовательности форматирования:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo $'\e[0m'
) | sed "
  s/$/$TC_SPC/;
  s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"

unterminated sample

Иными строками, которые вы должны отложить, чтобы содержать экраны, вы должны выделить их:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo $'\e[0m'
) | sed "
  s/\$/$TC_SPC/;
  s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\([^\o033]\\{${COLUMNS}\\}\\) */\\1\\3/
"

enter image description here

И наконец, чтобы иметь возможность заполнить очень длинные строки:

(
    echo $'\e[33;44;1mYellow text on blue background';
    seq 1 6;
    echo "This is a very very long long looooooooooong line that contain\
       more characters than the line could hold...";
    echo $'\e[0m';
) | sed "            
  s/\$/$TC_SPC/;
  s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\(\\([^\o033]\\{${COLUMNS}\\}\\)*\\) */\\1\\3/"

Nota: эта работа работает только в том случае, если форматирование экранов находится в начале строки.

Ответ 3

Попробуйте следующее:

echo -e '\E[33;44m'"yellow text on blue background"; tput sgr0