【发布时间】:2011-04-17 03:02:30
【问题描述】:
我使用的一些命令会显示颜色,但是当我将它们与 watch 一起使用时,颜色会消失:
watch -n 1 node file.js
是否有可能以某种方式恢复颜色?
【问题讨论】:
我使用的一些命令会显示颜色,但是当我将它们与 watch 一起使用时,颜色会消失:
watch -n 1 node file.js
是否有可能以某种方式恢复颜色?
【问题讨论】:
值得注意的是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'
【讨论】:
如果命令没有强制颜色输出的选项,其他答案可能不起作用。或者您可能像我一样懒惰,不想浏览每个命令的手册以找到正确的设置。我尝试了几种不同的技术:
script 命令脚本命令捕获交互式终端会话运行的输出。结合watch的--color参数,保留颜色:
watch --color "script -q -c '<command>' /dev/null"
-q 用于安静,-c 用于命令,/dev/null 是日志文件,不需要,因为 stdout 也会显示输出。
编辑:这是迄今为止最好的选择,我将早期的解决方案留给感兴趣的人。
正如一些人所建议的那样,可以使用带有 clear 和 sleep 的简单 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
该脚本修复了颜色问题,但仍然存在一个不同的错误:如果命令输出的行变短,则该行的其余部分不一定会被删除,因此 输出可能与实际不符!
【讨论】:
来自手表手册:
从程序输出中去除非打印字符。如果您想查看它们,请使用“cat -v”作为命令管道的一部分。
不过,我不知道如何使用它。
【讨论】:
watch -c "ls --color|cat -v" 在第一行显示^[[0m^[[01;34mAgent^[[0m。
watch --color ls --color=always .
虽然其他答案解决了这个问题,但最简单的方法是使用unbuffer 工具。要使用它,只需:
$ watch --color 'unbuffer <your-program>'
这样您就不必寻找程序的控制序列启用标志。但是需要注意的是,您的 watch 版本应该支持 --color 标志。
您可以使用 sudo apt-get install expect 在 Debian 或 Ubuntu 上安装 unbuffer。
【讨论】:
'unbuffer <command>' - 没有给出具体的使用命令,这如何回答问题?
<command> 替换为您希望使用颜色运行的特定程序吗?
不要使用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?
watch 这样的颜色代码,并且不会阻止命令闪烁
watch
while sleep <time> ; do x="$( <command> 2>&1 )" ; clear ; echo "$x" ; done -- 它仅使用 shell 内置程序来清除屏幕并显示输出,因此是闪烁最少的替代方案。
您可以在几行 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 和git diff。 FWIW,要使其正常工作,您必须将--color=always 传递给git diff(例如watch --color git diff --color=always。
watch 和git status 显示颜色,需要使用watch --color git -c color.status=always status。在此处查看链接答案unix.stackexchange.com/a/47065/268780。
是的
手表使用颜色输出。 它是 procps 包的一部分(至少在 debian 中) 这是针对您的问题的错误报告http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=129334 他们回答的地方,你应该更新 procps 包
例如使用 ubuntu 11.04 这个包可以工作http://packages.debian.org/wheezy/procps
tl;博士
更新过程
【讨论】: