web-dev-qa-db-ja.com

色を保持したbash watchコマンド

man watchから:

非印刷文字はプログラム出力から削除されます。表示したい場合は、コマンドパイプラインの一部として「cat -v」を使用します。

では、色付きの出力を表示したい場合、どのようにcat -vを使用すればよいですか。

watch ls -al --color
65

正しいコマンドは

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

Manページや--help画面には記載されていません。私はそれを見つけるために文字列を使用する必要があります。

77
paperhorse

「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"

それはあなたに色制御文字を示しています...私はあなたが望むものではないと思います。

27
davr

私のようにMacを使用している場合、Homebrewのwatchはカラーをサポートしていません。

欲しいのは fswatch ですが、まだHomebrewではありません。それをインストールするには、少し複雑なことをしたいと思うでしょう

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

使い方については this SO answer を参照してください。

6
fatuhoku

[〜#〜] update [〜#〜]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'