保留颜色的bash watch命令


57

来自man watch

从程序输出中删除非打印字符。如果要查看它们,请在命令管道中使用“ cat -v”。

所以,cat -v如果我想查看彩色输出,该如何使用:

watch ls -al --color

Answers:


63

正确的命令是

watch --color "ls -a1 --color"

手册页或--help屏幕中未记录该文件。我必须使用字符串来找到它。


@PawełGościckiNevermind已经在令人惊讶的地方发现了它,尽管无法使其与phpunit一起使用。
Ikke 2012年

1
我的表是v0.3.0,我在Ubuntu 10.0
帕维尔Gościcki

2
我也已经版本0.3.0和简单的“ls --color”,表命令将工作,但由于某种原因比较复杂的情况也不:watch --color "sudo iwlist wlan0 scanning | egrep 'Quality|ESSID' | egrep --color -i 'foobar|$'"会吃颜色:(
数学

@math:尝试交换单引号和双引号。
丹尼斯·威廉姆森

watch从V3.3.2开始,from procps(我相信大多数Linux发行版中的默认值)都有一个--color选项。
sleske 2013年

27

我认为使用“ watch”命令可能无法实现。这是一个更长的方法:

while true; do clear; date;echo;ls -al --color; sleep 2; done

您可以将其放在脚本中,例如:

echo "while true; do clear; date;echo;\$*;sleep 2; done" > watch2
chmod +x watch2
./watch2 ls -al --color

为了澄清,这就是为什么我认为使用'watch'命令不可能的原因。看看使用cat -v会发生什么:

watch "ls -al --color|cat -v"

它向您显示颜色控制字符...我想这不是您想要的。


man watch清楚地暗示没有争执就应该有可能watch
帕维尔Gościcki

它并不表示您将能够看到颜色。它说您将能够看到不可打印的字符。尝试使用上面的命令cat -v查看man watch正在讨论的内容。
davr 2010年

1
您可以通过以下方式稍微减少闪烁的持续时间:a)将要显示的数据收集到一个变量中,b)清除屏幕,c)打印该变量。
尼克·鲁索

1
@NickRusso感谢您的建议。这样的事情大大减少了闪烁:while true; do out=$(date;echo;ls -al --color);clear;echo $out;sleep 2;done
Kevin Mark

1
@KevinMark:您应该使用引号来处理多行:echo "$out"stackoverflow.com/q/2414150/86967
nobar

6

如果您使用的是Mac(例如我),那么watchHomebrew不支持色彩。

您想要的是fswatch,但还不是Homebrew。要安装它,您需要做一些更复杂的事情

https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3‌​/Library/Formula/fswatch.rb

有关用法,请参见此SO答案


2
这仅适用于文件系统,同时watch适用于命令
Brice 2014年

fswatch在Homebrew 0.9.5上可用
code_monk

1

更新:列出了watch解决此问题的最新版本。因此,如果的颜色watch --color不正确,最好对其进行更新(在我的系统中,位于procps包装中)。


根据watch --color我的经验,颜色支持有限(尽管足以满足ls -l --color)。这是我的@davr答案版本,具有一些额外的功能,最重要的是减少了闪烁。您可以将其放在.bashrc中,并用作cwatch ls -l --color

# `refresh cmd` executes clears the terminal and prints
# the output of `cmd` in it.
function refresh {
  tput clear || exit 2; # Clear screen. Almost same as echo -en '\033[2J';
  bash -ic "$@";
}

# Like watch, but with color
function cwatch {
   while true; do
     CMD="$@";
     # Cache output to prevent flicker. Assigning to variable
     # also removes trailing newline.
     output=`refresh "$CMD"`;
     # Exit if ^C was pressed while command was executing or there was an error.
     exitcode=$?; [ $exitcode -ne 0 ] && exit $exitcode
     printf '%s' "$output";  # Almost the same as echo $output
     sleep 1;
   done;
}

您也可以尝试类似

cwatch 'ls -l --color | head -n `tput lines`'

如果终端的行数少于输出。但是,仅当所有线都短于端子宽度时,这种方法才有效。我知道最好的解决方法是:

cwatch 'let lines=`tput lines`-2; ls -l --color | head -n $lines'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.