【问题标题】:Colors with unix command "watch"? [closed]带有unix命令“watch”的颜色? [关闭]
【发布时间】:2011-04-17 03:02:30
【问题描述】:

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

watch -n 1 node file.js

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

【问题讨论】:

标签: linux bash ubuntu watch


【解决方案1】:

值得注意的是watchdoes not support 8-bit colors and above yet

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

例子:

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

【讨论】:

  • 这有点可悲,因为它还不适用于 kubecolor ?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    来自手表手册:

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

    不过,我不知道如何使用它。

    【讨论】:

    • 这会导致控制字符在我的输出中可见,而不是导致着色。例如watch -c "ls --color|cat -v" 在第一行显示^[[0m^[[01;34mAgent^[[0m
    • 试试watch --color ls --color=always .
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 'unbuffer &lt;command&gt;' - 没有给出具体的使用命令,这如何回答问题?
    • @Danoram 你有什么不清楚的地方?您需要帮助将&lt;command&gt; 替换为您希望使用颜色运行的特定程序吗?
    • @Avamander 我会写那条评论,因为问题已被标记。如果您检查编辑历史记录,您会看到作者更新了答案。没有什么是不清楚的。我的评论不再相关了..
    • 只有你得到我的支持。所有其他投票较高的答案确实对我有所帮助。这个成功了
    • 这应该是被接受的答案。
    【解决方案5】:

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

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

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

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

    您可能想使用

    制作双缓冲穷人手表
    while sleep <time>; do <command> > /tmp/file; clear; cat /tmp/file; done
    

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

    【讨论】:

    • 也许使用while sleep &lt;time&gt;; do clear; &lt;command&gt; | tee /tmp/file; done 代替&gt;cat
    • 嗯我不明白@AndréLeria ... | tee 将删除像 watch 这样的颜色代码,并且不会阻止命令闪烁
    • @AndréLeria 第二个“例子”是一个错误的例子(正如它在 las 行中所说的那样)。关键是,一旦您碰到管道,您就会丢失颜色代码,因为您没有写入终端。它显示了由于清除和目标命令执行之间的时间间隔而尝试补偿闪烁是多么错误,使用管道缓冲工作,如watch
    • In bash: while sleep &lt;time&gt; ; do x="$( &lt;command&gt; 2&gt;&amp;1 )" ; clear ; echo "$x" ; done -- 它仅使用 shell 内置程序来清除屏幕并显示输出,因此是闪烁最少的替代方案。
    • @GézaTörök,是的,但这也清除了结果输出中的颜色代码,这是用户询问的主要问题。
    【解决方案6】:

    您可以在几行 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 选项并且由于任何原因无法升级软件包的情况,也许您可​​以将其放入。

    【讨论】:

      【解决方案7】:

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

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

      Related.

      【讨论】:

      • 看看:superuser.com/questions/125469/…(第一个答案)-也许你可以在你的答案中链接它。
      • 我来这里是为了使用watchgit diff。 FWIW,要使其正常工作,您必须将--color=always 传递给git diff(例如watch --color git diff --color=always
      • 对于 gpustat,"watch -n 1 --color gpustat --color" 有效。
      • 要使用watchgit status 显示颜色,需要使用watch --color git -c color.status=always status。在此处查看链接答案unix.stackexchange.com/a/47065/268780
      【解决方案8】:

      是的

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

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

      tl;博士

      更新过程

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 2021-12-05
        • 2012-12-28
        • 1970-01-01
        • 2020-03-01
        • 2016-05-18
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多