2010年4月11日

UNIXシェルで安全に色つき出力をする方法(追記有)

エスケープシーケンス使うとUNIXシェルからの出力に色を付けることができる

escape_echo.PNG

でも、こいつをファイルにリダイレクトすると、ゴミが入ってしまう

(追記開始)
コメ欄より:

test -t 1 コマンドで、出力先が端末かそれ以外かの判断ができるので、その結果を用いてエスケープシーケンス出力の有無を判断すれば良い。

----- 終了 --------------------------------------------

(追記終了)

escape_echo_editor.PNG

で、まぁシェルスクリプトからisatty()なんて呼べねーよなーとか思ってて放置してたんだけど、GNU版grepが、パターンにマッチした文字列に色を付ける機能を持っていることが判明。--color=autoと指定すると、grepが内部で端末への出力の場合エスケープシーケンスで色を付けて、ファイルへの出力では色をつけないように設定してくれるようです。

bashの関数にするとこんな感じです


function super_echo {
echo $* | GREP_COLOR='01' grep --color=auto '.' 2> /dev/null
if [ $? -ne 0 ]; then
echo $*
fi
}

super_echo Hello, World!

実行結果はこんな感じです
superecho1.PNG

autoconfを使う場合はこんな感じです。autoconfで使う場合、どんなシェルでも動くようにしなければならないためbashの関数機能は使えないです。代わりにマクロを利用します。あと、if文でよく使う[]が、m4マクロ的な理由で使えないです。


AC_DEFUN([SUPER_ECHO], [
echo $1 | GREP_COLOR='01' grep --color=auto '.' 2> /dev/null
if test $? -ne 0; then
echo $1
fi
])
SUPER_ECHO([Hello, World!])

実行結果はこんな感じです

superecho2.PNG


enjoy!

--------
autoconf 2.65(最新版)でconfigureスクリプト作った。
最新版minixで実行したら、「grepが長いラインを処理できいか-eオプションが複数つかなくてnot acceptable」とかで停止した。
minix...(´;ω;`)ブワッ... パッケージisoにGNU版grepがあったので入れたら通った。


 

コメント(2)

test -t 1

ご指摘ありがとうございます。

...orz

コメントする





トラックバック(0)

トラックバックURL: http://www.lunaport.net/mt/mt-tb.cgi/24

るなぽブログ

最近のブログ記事

最近のコメント

その他