Расширение терминальных цветов до конца строки
У меня есть 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
Фильтр заполнения
К сожалению, вы должны размещать каждую строку с точным количеством пробелов для изменения цвета всего фона линии.
Как вы говорите о bash, мое решение будет использовать 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}
Возможно, вам нужно правильно установить $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