シェルスクリプトでエラーメッセージに色をつける

bash や sh のシェルスクリプトでエラーメッセージや警告メッセージをカラフルに色付けして表示するコードを公開します.スクリプトの雛形にどうぞ.なかなか便利です.

スクリプトの雛形

#!/bin/bash

# Colorize output only if stdout referers to terminal
if [ -t 1 ]; then
    textred="\033[1;31m"
    textgreen="\033[1;32m"
    textyellow="\033[1;33m"
    textblue="\033[1;34m"
    textreset="\033[0m"
fi

error() { echo -e $textred$@$textreset > /dev/stderr; exit 1; }
warning() { echo -e $textgreen$@$textreset > /dev/stderr; }

# 以下,使用例
warning Hello, $USER
error fugafuga 

error()関数と,warning()関数を定義しています.

使い方

warning 引数1 [引数2 ..]

警告メッセージを緑で表示します.メッセージは標準エラー出力に出ます

error 引数1 [引数2 ..]

エラーメッセージを赤で表示し,プログラムをexit します.メッセージは標準エラー出力に出ます

ポイント

ポイントは2つあります

エスケープシーケンスの制御文字は"\e"ではなく"\033"と書く

"\e"が使えるのは比較的新しいbash だけです.たとば macOS Mojave 標準のbash は "\e" を認識しません.互換性を考えると "\033"と書いておいたほうが無難です

出力がファイルやパイプにリダイレクトされている場合は色付けしない

ログファイルなどにリダイレクトしている場合は色付けは邪魔です.そこで 4行目の処理でリダイレクトされているかどうか調べて色付け表示のOn/Offを切り替えています