時計の色が壊れるのを防ぐ

時計の色が壊れるのを防ぐ

仕事でログ ファイルを監視するスクリプトを変更して、特定の項目を選別して色付けしています。最終的な出力は、複数の列に 6 桁の数字がリストされます。~数字の先頭に を追加することができ、最終的な出力には何の問題もありませんが、見た目が悪く、読みにくいです。ただし、先行する bash スクリプトまたは perl スクリプトでのデータの最終処理で数字を色付けしようとすると、色のテキストが壊れてしまいます。

たとえば、次の元の番号を入力します$num

123456

私はこれを perl で入力します (または、bash でもほぼ同じものを入力します)。

"\e[1;34m" . $num . "\e[0m"

そして、私が得たものは次のとおりです:

[1;34m123456[0m 

これもエスケープバージョンで試してみましたが、結果は同じでした:

"\x1B[1;34m" . $num . "\x1B[0m"

これが違いを生むのであれば、実際のスクリプトのスタックは次のようになります (混乱しています)。

  • grepPerl はシェル スクリプト内で呼び出され、 // etcにパイプされますcut
  • シェル スクリプトにcut/etc. を追加し、.pl にパイプします。
  • シェルスクリプトは出力を監視する

watch色は好きじゃないのかな?

あまりよく知らないperlので、印刷ラインの周囲に表示されているものを示しても問題ないと思います。

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

答え1

私は「色を盗む」問題に遭遇しました時計これは、watch が単純な /bin/sh 出力スタイルを使用するため、色、エイリアス、ショートカットなどすべてが上書きされてしまうためです。

そこで私はこれをまとめ、.bashrc、独自のエイリアス、ショートカットなどをすべて使用できるようになります。

Usage:
    watcher 20 'somecommand | apipe | grep'

数字は更新間の遅延(秒単位)です。コマンドには引用できる任意の文字列を含めることができます。

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

詳しく見てみましょう:

function watcher()
{ 
  WATCHERTIME=$1
  WATCHERFILE=/tmp/watcher$$
  shift
  while true; do
    WATCHERHEIGHT=$(($LINES - 5))
    ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
    clear
    /bin/echo -n "Every ${WATCHERTIME} seconds - "
    date
    /bin/echo
    cat ${WATCHERFILE}
    \rm -f ${WATCHERFILE}
    /bin/echo
    /bin/echo "=="
    sleep ${WATCHERTIME}
  done
}

現在の画面の高さを行単位で決定し、独自の出力に十分な量を減算してから、指定されたコマンドを繰り返し実行し、画面をクリアして出力を表示し、次のループを待ちます。出力が終了した場所を示すために、下部に短い「==」が表示されます。これを知っておくと役立つ場合があります。

表示時の遅延が最小限になるように、この方法を採用しました。出力をキャプチャしてから表示しないと、長い一時停止が発生し、その後出力が... 不快になります。

色が損なわれることはありませんので、いつも通りのものが手に入ります。お楽しみください!

答え2

問題は、watchCurses を使用し、curses文字列出力関数が、文字とその属性/色用に別々のプレーンを持つ仮想フレームバッファで動作することです。文字列は、端末ディレクティブの解釈なしで、そのままフレームバッファに送信されます。端末状態の破壊を防ぐために、Curses はESC(他のものの中でも) を無視するため、watchデフォルトでは色付けを行いません。

賢明なアドバイスに従うことで、この問題を解決できます。ジェーエムまたはロルニックス:watch --colorスクリプトをwhile true; do clear; $SCRIPT; sleep 2; doneループのようなもので使用またはラップします。

答え3

おそらく、--colorのオプションが必要になりますwatch

関連情報