Предотвращение наручных цветов

Я изменяю скрипты на работе, которые отслеживают файлы журналов, чтобы выделить определенные элементы и раскрасить их. Конечным результатом является список из 6-значных чисел в нескольких столбцах. Я смог добавить ~ к началу номера, и он ничего не сломал в финальном выпуске, но это довольно уродливо и трудно читать. Тем не менее, когда я пытаюсь раскрасить число, либо в предыдущих сценариях bash, либо при окончательной обработке данных в perl-скрипте, цветной текст сбрасывается.

Например, исходное число, которое я буду помещать в $num :

  • Потрясающее поведение округления с печатью
  • Где найти ссылку на форматирование printf?
  • Печать столбцов данных, которые
  • printf в сценарии оболочки can not do \ x% x
  • Человеко-читаемые файлы с помощью printf
  • Как добавить несколько строк с переменными в конец сценария bash?
  •  123456 

    Я ввожу это в perl (или, что то же самое в bash):

     "\e[1;34m" . $num . "\e[0m" 

    И вот что я получаю:

     [1;34m123456[0m 

    Я также пробовал это, сбежавшую версию, но получаю то же самое:

     "\x1B[1;34m" . $num . "\x1B[0m" 

    Если это имеет значение, вот реальный стек скриптов (это беспорядок):

    • Perl вызывается внутри сценария оболочки, который затем соединяется с grep / cut / etc.
    • сценарий оболочки с большим количеством cut / etc., затем трубы в .pl
    • сценарий оболочки показывает, что вывод

    Может быть, watch не любят цвет?

    Я не очень хорошо знаю perl , поэтому, думаю, не помешает показать, что я вижу вокруг печатных линий:

     my $format = ("%-8s") x scalar(@{$a[0]}); printf("$format\n", @$_) 

  • Человеко-читаемые файлы с помощью printf
  • Где найти ссылку на форматирование printf?
  • Как использовать printf и% s при наличии цветовых кодов?
  • Точная метка времени в Bash с printf (не тривиальная проблема)
  • Добавление ведущих символов перед строкой с использованием printf или echo
  • конвертировать временную метку в эпоху с bash builtin printf
  • 3 Solutions collect form web for “Предотвращение наручных цветов”

    Я столкнулся с проблемами «крашения цвета» с помощью часов , потому что часы используют простой стиль / bin / sh output, который захватывает любой цвет, псевдонимы, ярлыки … весь shebang!

    Поэтому я собрал это вместе, разместил в моем .bashrc , позволяет мне использовать все свои собственные псевдонимы, ярлыки и многое другое:

     Usage: watcher 20 'somecommand | apipe | grep' 

    Число – это задержка между обновлениями, в секундах, команда может включать в себя все, что вы можете процитировать.

     ###### 'watch' workalike, lets me use my aliases and such function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; } 

    Чтобы сломать это:

     function watcher() { WATCHERTIME=$1 WATCHERFILE=/tmp/watcher$$ shift while true; do WATCHERHEIGHT=$(($LINES - 5)) ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null clear /bin/echo -n "Every ${WATCHERTIME} seconds - " date /bin/echo cat ${WATCHERFILE} \rm -f ${WATCHERFILE} /bin/echo /bin/echo "==" sleep ${WATCHERTIME} done } 

    Он определяет текущую высоту экрана в строках, вычитает достаточно для собственного вывода, затем повторно выполняет указанную команду, затем очищает экран, отображает вывод и ждет следующего цикла. Он показывает короткое «==» внизу, чтобы обозначить, где заканчивается вывод. Когда-нибудь это полезно знать.

    Я сделал это так, чтобы при отображении была минимальная возможная задержка. если вы не захватили вывод и затем отобразите его, вы получите длинную паузу, а затем выход … icky.

    Так как это не clobber цвета, вы получаете все, что вы привыкли получать. Наслаждайтесь!

    Проблема в том, что watch используют Curses, а функции вывода строки curses работают на виртуальном фреймбуфере с отдельными плоскостями для символов и их атрибутов / цветов. Строки отправляются в фреймбуфер как есть, без терминальной интерпретации. Чтобы защитить от заклинивания состояния терминала, Curses игнорирует ESC (между прочим), поэтому watch не будут делать цвет по умолчанию.

    Вы можете исправить это, следуя советам мудрецов jw013 или lornix : либо используйте watch --color либо завершите свой скрипт чем-то вроде while true; do clear; $SCRIPT; sleep 2; done while true; do clear; $SCRIPT; sleep 2; done while true; do clear; $SCRIPT; sleep 2; done цикл.

    Вероятно, вам нужна опция --color для watch .

    Linux и Unix - лучшая ОС в мире.