man watch
から:
非印刷文字はプログラム出力から削除されます。表示したい場合は、コマンドパイプラインの一部として「cat -v」を使用します。
では、色付きの出力を表示したい場合、どのようにcat -v
を使用すればよいですか。
watch ls -al --color
正しいコマンドは
watch --color "ls -a1 --color"
Manページや--help画面には記載されていません。私はそれを見つけるために文字列を使用する必要があります。
「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"
それはあなたに色制御文字を示しています...私はあなたが望むものではないと思います。
私のようにMacを使用している場合、Homebrewのwatch
はカラーをサポートしていません。
欲しいのは fswatch ですが、まだHomebrewではありません。それをインストールするには、少し複雑なことをしたいと思うでしょう
https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
使い方については this SO answer を参照してください。
[〜#〜] 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'