bash-program watch и escape-последовательности ANSI в выводе [дубликаты]

Возможный дубликат:
Цвета с командой unix "watch"?< /а>

В одной из моих программ я хочу использовать цветной текст в качестве вывода, поэтому я использую для этого escape-последовательности ANSI, например. так:

echo -e '\033[34mHello World\033[0m'

Он печатает «Hello World» синим цветом. (на самом деле это программа Python, использующая «печать», но это не имеет значения для вопроса)

Теперь я хочу повторить выполнение программы с помощью bash-программы «часы». Но когда я выполняю ту же самую строку, что и выше, используя «часы», т.е.

watch echo -e '\033[34mHello World\033[0m'

текст не синий, и вывод становится «-e 033[34mHello World033[0m». Таким образом, escape-последовательности ANSI каким-то образом не декодируются.

Есть ли способ заставить программу «смотреть» уважать escape-последовательности или есть альтернатива «смотреть» для получения того же эффекта?

Это нормально, если он работает только в Linux, поскольку я использую только его.

Обновление: Таким образом, одним из решений будет установка более новой версии «watch», которая знает параметр --color. А есть ли другой способ, может подобную программу "смотреть"? (Я не администратор этой машины.)


person proggy    schedule 30.11.2012    source источник
comment
Также связано stackoverflow.com/questions/2417824/   -  person proggy    schedule 30.11.2012
comment
Насколько я знаю, watch не является встроенной оболочкой bash, а является исполняемой программой /usr/bin/watch.   -  person Basile Starynkevitch    schedule 30.11.2012
comment
Спасибо, я изменил название соответственно   -  person proggy    schedule 30.11.2012


Ответы (2)


Опция --color помогает мне.

watch --color -n 1 "echo -e '\033[36mHello World\033[0m'"

Или, при отсутствии варианта цвета, как насчет доморощенных часов:

while [ 1 ]; do clear; echo -e '\033[36mHello World\033[0m'; sleep 1; done
person ddoxey    schedule 30.11.2012
comment
Да, спасибо, но я только что узнал, что у меня старая версия часов без опции --color. Но это действительно было бы решением проблемы. - person proggy; 30.11.2012
comment
Ага. Я думал, что это было слишком просто. - person ddoxey; 30.11.2012
comment
Хм, ваше второе решение не идеально, потому что оно немного неприятно мигает на экране (моей программе требуется некоторое время, прежде чем она покажет результаты). Но все же ваш ответ очень ценен. - person proggy; 30.11.2012
comment
Ах, но если я кэширую результаты своей программы перед очисткой экрана, я получаю желаемый эффект: - while [ 1 ]; сделать = $ (выполнить_что угодно); Чисто; эхо $а; сон 2; сделано - я думаю, что это работает для меня, я просто оборачиваю его в небольшой скрипт (cwatch?) и все :) - person proggy; 30.11.2012

Основываясь на ответе ddoxey, я написал небольшой скрипт «cwatch», который на данный момент решает мою проблему:

#!/bin/bash
# do something similar to "watch", but enable ANSI escape sequences for colors
# obsolete if new version of "watch" is available which has the --color option
# 2012-11-30

while [ 1 ]
do
  output=$(eval $@)
  clear
  echo -e "$output"
  sleep 2
done

Я все еще мог бы добавить опцию "--delay"...

person proggy    schedule 30.11.2012