Bash程序中的"watch"和ANSI转义序列在输出中的应用

11

可能是重复问题:
使用Unix命令“watch”显示颜色?

在我的一个程序中,我想要使用彩色文本作为输出,因此我正在使用ANSI转义序列来实现,例如:

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

它会以蓝色打印出“Hello World”(实际上是使用“print”的Python程序,但对于这个问题并不重要)。

现在我想使用bash程序“watch”重复执行该程序。但是当我使用“watch”执行与上面相同的命令时,即

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

文本不是蓝色的,输出变成了“-e 033[34mHello World033[0m”。因此,ANSI转义序列没有被解码。

有没有办法让程序“观察”这些转义序列,或者有没有类似于“watch”的替代方案来达到相同的效果?

如果它只在Linux上工作也没关系,因为我只使用它。

更新: 所以一个解决方案是安装一个更新版本的“watch”,该版本支持--color选项。但还有其他方法吗,也许有一个类似于“watch”的程序?(我不是那台机器的管理员。)


还有一个相关的问题是:https://dev59.com/oXE95IYBdhLWcg3wMa91 - proggy
据我所知,watch不是bash shell内置命令,而是/usr/bin/watch可执行程序。 - Basile Starynkevitch
谢谢,我已经相应地更改了标题。 - proggy
2个回答

15

--color选项对我很有用。

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

如果没有颜色选项,那么怎么样使用自制的watch:

while [ 1 ]; do clear; echo -e '\033[36mHello World\033[0m'; sleep 1; done

是的,谢谢你,但我刚刚发现我的“watch”版本太旧了,没有--color选项。但这确实是解决问题的方法。 - proggy
啊哈。我觉得那太简单了。 - ddoxey
嗯,你的第二个解决方案并不理想,因为它会闪屏,这有点让人不舒服(我的程序在显示结果之前需要一些时间)。但是,我非常感谢你的回答。 - proggy
1
啊,但是如果在清屏之前缓存程序的结果,我就可以获得期望的效果:- while [ 1 ]; do a=$(execute_whatever); clear; echo $a; sleep 2; done - 我认为这对我有用,我只需要将其包装成一个小脚本(cwatch?),就可以了 :) - proggy

6

根据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”选项...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接