如何使watch命令解释vt100序列?

时间:2010-03-10 14:56:17

标签: linux unix shell terminal watch

考虑这个简单的例子(以红色显示):

 echo -e "\033[31mHello World\033[0m"

它在终端上以红色正确显示。现在考虑:

watch echo -e "\033[31mHello World\033[0m"

它不显示颜色。

注意:我知道通过清除和重新运行来编写一个模仿基本行为的循环很容易。但是,清除操作会导致屏幕闪烁,这在手表

下不会发生

编辑:最初这个问题指定了转义序列而不是vt100序列,但这不是我所追求的,并且用单引号解决了。

3 个答案:

答案 0 :(得分:12)

来自Ubuntu 11.10的 man watch 0.3.0 watch

  

默认情况下,watch通常不会传递转义字符,但是如果使用--c或--color选项,则watch会解释前景的ANSI颜色序列。

它似乎不适用于我的终端上的文字字符串,但这些工作:

watch --color 'tput setaf 1; echo foo'
watch --color ls -l --color

答案 1 :(得分:4)

修改

watch的更新版本支持颜色。在问题中的示例的特定情况下,您将需要使用额外的引用级别来保留引号和转义:

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

来自man watch

  -c, --color
          Interpret ANSI color sequences.

<强>此前:

来自man watch

  

从程序输出中删除非打印字符。使用“cat -v”          作为命令管道的一部分,如果你想看到它们。

但他们没有被解释,所以我认为没有办法。

答案 2 :(得分:1)

您可以尝试单引用命令:

watch 'echo -e "\tHello World"'

在我的计算机上,这为我留下了-e作为第一个字符,以及正确的标签hello world. 似乎-e是我的echo版本的默认值。不过,这是向正确标签hello world

的进展

发生的事情是双重不加引用:
看什么看

echo -e "\033[31mHello World\033[0m"

watch所调用的shell见:

echo -e \033[31mHello World\033[0m

然后反斜杠发挥作用,即使被引用,也会成为引用噩梦。