保留颜色的 bash watch 命令

保留颜色的 bash watch 命令

man watch

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

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

watch ls -al --color

答案1

正确的命令是

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

它没有记录在手册页或 --help 屏幕中。我必须使用字符串来找到它。

答案2

我认为使用“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"

它向您显示了颜色控制字符……我认为这不是您想要的。

答案3

如果您像我一样使用的是 Mac,watch那么 Homebrew 不支持颜色。

你想要的是样本但它还不是 Homebrew。要安装它,你需要做一些更复杂的操作

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

这个答案以供使用。

答案4

更新:事实证明,最新版本已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'

相关内容