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

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

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

 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 "$ V" терпит неудачу, если это: '^ +% & /% + ^
  • Как печатать слева и справа от уже напечатанного вывода
  • Где найти ссылку на форматирование printf?
  • Формат ширины столбца с Printf
  • Довольно печатать в VIM?
  • Почему история Bash не записывает эту команду?
  • Невозможно сохранить значение ascii в переменной
  • Отключение параметров упрощения безопасности для среды `nix-shell`
  • 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 .

    Interesting Posts

    Невозможно изменить пароль linux

    удаление подстроки в find -exec

    Запись данных как в файл, так и в последовательный порт – могу ли я использовать тройник?

    Встроенное устройство: как выполнять сырые чтения и запись на флэш (emmc / movinand) в обход кеша файловой системы

    Почему жесткие ссылки действительны только в одной и той же файловой системе?

    Иконки GTK для специальных файлов

    Могу ли я добавить / proc / self?

    shell: Оператор = ~ не работает должным образом

    Понимание btrfs dmesg

    Как заблокировать доступ к «частной» сети только для хоста из интерфейса VirtualBox nat (отдельные сети только для хоста)?

    Не удалось подключиться к виртуальному менеджеру kvm

    Как дважды загружать Linux и Windows с небольшого загрузочного диска?

    bash / sh для замены текста между некоторыми тегами / строками в текстовом файле

    Сервер Ubuntu: как сделать загрузочное RAID-устройство bios_grub?

    Как получить разрешение внешнего монитора, установленное xrandr, для сохранения

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