用unix命令“ watch”显示颜色?


Answers:



31

不要使用watch...当您使用监视程序时,可以检测到它们没有写入终端,然后去除颜色。您必须使用特定的程序标志来将控制代码保留在那里。

如果您不知道这些标志,或者没有,您可以通过以下方式让穷人的手表:

while sleep <time>; do clear; <command>; done

它将有一些闪烁(手表的工作是“双缓冲”),但是对于某些东西它已经足够有用了。

您可能会想使用以下方法制作双缓冲穷人手表

while sleep <time>; do <command> > /tmp/file; clear; cat /tmp/file; done

但是,然后您将再次点击“我不在写终端”功能。


也许用while sleep <time>; do clear; <command> | tee /tmp/file; done代替>cat
安德烈·莱里亚

嗯,我不明白@AndréLeria... | T恤将删除颜色代码,如watchdo,并且不会阻止命令闪烁
-theist

这是第二个示例的建议,它也没有给我颜色。也许我做错了什么?
安德烈·莱里亚(AndréLeria)

1
@AndréLeria第二个“示例”是一个错误的示例(如las行中所述)。关键是,一旦您碰到管道,就会丢失颜色代码,因为您没有在写入终端。它在那里显示试图补偿由于使用管道缓冲工作而在清除和目标命令执行之间的时间间隔而造成的闪烁是多么错误的方法watch
theist

4
在bash中:while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done-它仅使用shell内置程序来清除屏幕并显示输出,因此是闪烁最少的选择。
盖佐Török

18

您可以watch在几行shell脚本中复制基本的基本操作。

$ cat cheapwatch 
#!/bin/sh

# Not quite your Rolex

while true ; do
  clear
  printf "[%s] Output of %s:\n" "$(date)" "$*"
  # "$@" <- we don't want to do it this way, just this:
  ${SHELL-/bin/sh} -c "$*"
  sleep 1  # genuine Quartz movement
done

$ ./cheapwatch ls --color  # no problem

最终,一个非常聪明的人会tr在该脚本中使用一个命令,该命令会剥离控制字符,然后迫使用户使用该命令--color来禁用该逻辑。暂时而言,这种实现方式的天真之处在于远离了那些吃色怪物。

如果您处于watch无法--color选择的情况,并且无论出于何种原因都无法升级软件包,也许可以扔掉它。



8

尽管其他答案可以解决此问题,但最简单的方法是使用该unbuffer工具。要使用它,只需执行以下操作:

$ watch --color 'unbuffer <your-program>'

这样,您不必寻找程序的控制序列启用标志。需要注意的是,您的手表版本应支持该--color标志。

您可以使用在Debian或Ubuntu上安装unbuffer sudo apt-get install expect


'unbuffer <command>'-没有给出特定的命令来使用它如何回答问题?
Danoram,

@Danoram您不清楚什么?您是否需要帮助来替换<command>要使用颜色运行的特定程序?
Avamander

@Avamander我会写那条评论,因为该问题已被标记。如果您查看编辑历史记录,将会看到作者更新了答案。没有什么是不清楚的。我的评论不再
适用。–

1

从手表手册:

非打印字符从程序输出中删除。如果要查看它们,请在命令管道中使用“ cat -v”。

虽然,我不确定如何使用它。


5
这会使控制字符对我来说在输出中可见,而不是引起着色。例如watch -c "ls --color|cat -v"显示^[[0m^[[01;34mAgent^[[0m第一行。
Drew Noakes 2014年

1
尝试watch --color ls --color=always .
张隆琪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.