我使用的一些命令显示颜色,但是当我将它们与 watch 一起使用时,颜色会消失:
watch -n 1 node file.js
是否有可能以某种方式恢复颜色?
不要使用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
标志。
你可以在 Debian 或 Ubuntu 上使用sudo apt-get install expect
.
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
选择的情况并且由于某种原因无法升级软件包,也许您可以将其加入。
是的
手表适用于颜色输出。它是 procps 包的一部分(至少在 debian 中)这里是你的问题的错误报告http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=129334 他们回答的地方,你应该更新 procps包裹
例如,使用 ubuntu 11.04 这个包可以工作http://packages.debian.org/wheezy/procps
tl;博士
更新过程
来自手表手册:
从程序输出中去除非打印字符。如果您想查看它们,请使用“cat -v”作为命令管道的一部分。
虽然,我不确定如何使用它。
如果命令没有强制颜色输出的选项,其他答案可能不起作用。或者您可能像我一样懒惰,不想浏览每个命令的手册以找到正确的设置。我尝试了几种不同的技术:
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
该脚本修复了颜色问题,但仍然存在一个不同的错误:如果命令输出的行变短,则该行的其余部分不一定会被删除,因此输出可能与实际不符!
值得注意的是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'