使用 unix 命令“手表”的颜色?

我使用显示颜色的一些命令,但是当我使用它们与手表一起使用时,颜色消失了:

watch -n 1 node file.js

有没有可能把颜色重新染上呢?

62506 次浏览

手表手册:

从程序输出中去除非打印字符。如果您希望查看“ cat-v”,请将其作为命令管道的一部分。

不过,我不知道该怎么用。

一些新版本的 watch现在支持彩色。

例如 watch --color ls -ahl --color

相关资料。

是的

手表与颜色输出工程。 它是 procps 包的一部分(至少在 debian 中是这样) 这里是你的问题 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=129334巴格波特 他们回答,你应该更新的 procps 软件包

例如,在 ubuntu11.04中,这个软件包可以工作在 http://packages.debian.org/wheezy/procps

博士

更新程序

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

$ 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的选项,你不能升级软件包的任何原因,也许你可以扔在这里。

不要使用 watch... 当您使用手表程序可以检测到他们没有写入终端,然后剥离的颜色。您必须使用特定的程序标志来保持控制代码在那里。

如果你不知道旗帜,或者没有旗帜,你可以让一个穷人看着:

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

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

你可能会被诱惑,使一个双缓冲穷人的手表使用

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

但之后你会再次遇到“我没有写到终端”的特性。

当其他答案解决这个问题时,最简单的方法是使用 unbuffer工具。简单地使用它:

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

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

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

unbuffer是一个很好的方式 ,以避免让进程知道它是否写 TTY,但值得注意的是,watch 还不支持8位以上的颜色

如果你使用更现代的 就像 bat或者 exa代替 ls,你应该附加 --theme=ansi(甚至 --theme=base16也不行)。git log开箱即用,因为它总是使用3位颜色(来源)。

例如:

watch --color -d -n 0.5 'mycommand file | bat --color=always --theme=ansi'

也可以用 -f代替 --color=always

另一种选择可能是 色素

如果命令没有强制颜色输出的选项,则其他答案可能不起作用。或者您可能像我一样懒惰,不想浏览每个命令的手册来找到正确的设置。我尝试了几种不同的方法:

script命令

脚本命令捕获由交互式终端会话运行的输出。结合 watch--color参数,它保留了颜色:

watch --color "script -q -c '<command>' /dev/null"

-q表示安静,-c表示命令,/dev/null表示日志文件,这是不需要的,因为 stdout 也显示输出。

编辑: 到目前为止,这是最好的选择,我把下面的解决方案留给感兴趣的人。

早期尝试: 重写终端窗口

正如一些人建议的那样,可以使用带有 clearsleep的简单 while 循环在终端中运行命令,而不需要捕获其输出。这通常会导致闪烁,因为 clear删除所有字符,然后命令需要一些时间逐行打印新的输出。

幸运的是,您可以使用 tput通过一些聪明的终端技巧来解决这个问题。只要在顶部写入新输出时保持旧输出可见即可。

剧本如下:

#!/bin/sh
trap "tput cnorm" EXIT  # unhide the cursor when the script exits or is interrupted


# simple interval parameter parsing, can be improved
INTERVAL=2s
case $1 in
-n|--interval)
INTERVAL="$2"
shift; shift
;;
esac


clear           # clear the terminal
tput civis      # invisible cursor, prevents cursor flicker


while true; do
tput cup 0 0  # move cursor to topleft, without clearing the previous output
sh -c "$*"    # pass all arguments to sh, like the original watch
tput ed       # clear all to the end of window, if the new output is shorter
sleep "$INTERVAL"
done

这个脚本修复了颜色问题,但是仍然存在一个不同的 bug: 如果命令输出的行变短,那么行的其余部分不一定被擦除,因此 输出可能与现实不符!