158

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

watch -n 1 node file.js

是否有可能以某种方式恢复颜色?

4

8 回答 8

200

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

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

相关

于 2010-09-25T14:37:18.633 回答
49

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

如果您不知道旗帜或没有旗帜,您可以通过以下方式让穷人观看:

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

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

您可能很想使用双缓冲穷人手表

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

但是你会再次遇到“我没有写到终端”功能。

于 2016-11-28T16:50:35.940 回答
18

虽然其他答案解决了这个问题,但最简单的方法是使用该unbuffer工具。要使用它,只需执行以下操作:

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

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

你可以在 Debian 或 Ubuntu 上使用sudo apt-get install expect.

于 2019-11-11T21:40:25.530 回答
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选择的情况并且由于某种原因无法升级软件包,也许您可​​以将其加入。

于 2016-05-27T01:03:14.107 回答
8

是的

手表适用于颜色输出。它是 procps 包的一部分(至少在 debian 中)这里是你的问题的错误报告http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=129334 他们回答的地方,你应该更新 procps包裹

例如,使用 ubuntu 11.04 这个包可以工作http://packages.debian.org/wheezy/procps

tl;博士

更新过程

于 2011-12-10T17:32:25.457 回答
2

来自手表手册:

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

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

于 2010-09-25T09:00:08.180 回答
1

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

script命令_

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

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

-q是为了安静,-c是为了命令,/dev/null是日志文件,因为标准输出也显示输出,所以不需要它。

编辑:这是迄今为止最好的选择,我为感兴趣的人留下了下面的早期解决方案。

早期尝试:重写终端窗口

正如一些人所建议的那样,一个简单的while循环clear可以sleep用于在终端中运行命令而不捕获其输出。这通常会导致闪烁,因为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

该脚本修复了颜色问题,但仍然存在一个不同的错误:如果命令输出的行变短,则该行的其余部分不一定会被删除,因此输出可能与实际不符!

于 2021-09-30T08:31:29.863 回答
1

值得注意的是watch 还不支持8位及以上的颜色

如果ls你使用更现代的东西bat不是你应该附加的东西--theme=ansi(甚至不起作用--theme=base16)。git log开箱即用,因为它始终使用 3 位颜色(source)。

例子:

watch --color -d -n 0.5 'mycommand file | bat --color=always --theme=ansi'
于 2021-09-18T00:23:33.880 回答