どうしてデバッグ端末はカラフルではないのか?

  • 投稿日:
  • by
  • カテゴリ:



そりゃまぁ見難いからか?


仮想端末でsshでつないだりしていると、シェルや設定によっては、ls結果もカラフルですよね。


カラフルなls結果の例:


f:id:syasuda:20100405210103p:image





たとえばこれをteratermのログ機能でファイルに保存した場合、テキストモードでは色が保存されない点は注意を要します。バイナリで保存しておけば、teratermの「ログを再生」機能で色付きで再現可能です。*1


で、エスケープシーケンスはgrepするには邪魔になりますので、除去するにはcolコマンドを使うのが王道のようです。


コマンド例:



$ cat log.txt | col -b



実行結果(フィルタした場合):


f:id:syasuda:20100405210059p:image


実行結果(フィルタなしでcatした場合):


f:id:syasuda:20100405210248p:image


だめでもsedかperlでフィルタを書けばよいだけのことです。

実際のコードは\nや\tを追加するのと同じです。*2


エスケープシーケンスの書き方の例:



#include <stdio.h>

/* ダミー(ほんとうはデバッグ用端末に出力する) */
#define DEBUG_LOG printf

int main()
{
DEBUG_LOG( "This is \033[34mblue\033[0m \n" );
DEBUG_LOG( "This is \033[1;34mlight blue\033[0m \n" );
return 0;
}

実行結果(端末介してない):


f:id:syasuda:20100405210101p:image



printfデバッグは、どうにも評価が低く、みんなこそこそ書きます。コーディング規約は立派なものがあるのに、ログはバラバラ。しかも複数の異なる箇所で同じ文言を出力するというようなどうしようもない状況もよくある風景です。


エラーチェックのログは赤、警告ログは橙などとするだけでも、いろんな作業の役に立つ場合があるかと思います。


先に書いたエスケープシーケンスがgrepの邪魔になることは周知しておくか、仕組みを説明しても通じない人々には、ログをテキストモードで取得させるようにするのが良い気もします。



参考にしたリンク:


エスケープシーケンスについて


http://hp.vector.co.jp/authors/VA016670/escape_code.html


Bash Prompt HOWTO: ANSI エスケープシーケンス: 色とカーソル操作


http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-5.html


colのmanpage


http://www.linux.or.jp/JM/html/util-linux/man1/col.1.html




*1:バイナリのときタイムスタンプが付けられないのは困るが。


*2:どっちもエスケープシーケンス。あとは仮想端末が対応しているかどうかだけ。