ubuntu 使用unix命令“watch”的颜色?[关闭]

vdgimpew  于 2023-04-11  发布在  Unix
关注(0)|答案(8)|浏览(203)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site主题相关,您可以留下评论以解释在何处可以回答此问题。
1年前关闭。
社区在1年前审查了是否重新打开此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我使用的一些命令显示颜色,但当我将它们与watch一起使用时,颜色消失了:

watch -n 1 node file.js

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

nr9pn0ug

nr9pn0ug1#

一些较新版本的watch现在支持彩色。
例如watch --color ls -ahl --color
Related
如果您期望彩色输出时看到的是单色输出,很可能是您在watch中运行的命令检测到它没有连接到终端,您需要强制彩色输出。一些示例:

CLICOLOR_FORCE=1 watch --color ls -ahl    # MacOS
watch --color ls -ahl --color=always      # Ubuntu

对于ls和其他程序,您可能需要进行其他配置,但即使您没有使用watch,这些配置也会显示出来。

ufj5ltwl

ufj5ltwl2#

不要使用watch ...当你使用watch程序时,它可以检测到它们没有写入终端,然后去掉颜色。你必须使用特定的程序标志来保持控制代码在那里。
如果你不知道旗帜或没有,你可以让一个穷人的人看:

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

它会有一点 Flink (手表工作“双缓冲”),但对于一些东西,它是足够有用的。
你可能会想做一个双缓冲穷人的手表使用

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

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

0dxa2lsx

0dxa2lsx3#

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

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

这样你就不必去寻找程序的控制序列使能标志了,但需要注意的是,你的watch版本应该支持--color标志。
您可以使用sudo apt-get install expect在Debian或Ubuntu上安装unbuffer。

lmvvr0a8

lmvvr0a84#

您可以在几行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选项,并且无论出于何种原因您都无法升级软件包,那么您可以添加此选项。

hsgswve4

hsgswve45#

是的
watch可以使用颜色输出.它是procps包的一部分(至少在debian中)这里是你的问题http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=129334的bugreport,他们回答,你应该更新procps包
例如,在ubuntu 11.04中,此软件包适用于http://packages.debian.org/wheezy/procps
博士
更新过程

tyky79it

tyky79it6#

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

script命令

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

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

-q用于quiet,-c用于command,/dev/null是日志文件,不需要它,因为stdout也显示输出。
编辑:这是目前为止最好的选择,我把之前的解决方案留给了感兴趣的人。

前期尝试:重写终端窗口

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

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

yzxexxkh

yzxexxkh7#

手表手册:
非打印字符将从程序输出中剥离。如果您想查看它们,请使用“cat -v”作为命令管道的一部分。
但是我不知道如何使用它。

xxhby3vn

xxhby3vn8#

unbuffer is a great way以避免让进程知道它是否正在写入TTY,但值得注意的是watchdoes not support 8-bit colors and above yet
如果您使用更现代的like batexa而不是ls,则应该附加--theme=ansi(甚至--theme=base16也不起作用)。git log开箱即用,因为它总是使用3位颜色(源代码)。
示例:

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

也可以使用-f代替--color=always
另一个替代方案可以是Pygments

相关问题