#!/bin/bash exec 2> >(sed -u $'s/.*/\e[31m&\e[0m/' >&2) # 標準エラー出力を赤にする
スクリプトの先頭にこの1行を追加するだけでOK
超便利
コマンドの標準エラー出力を奪って、エスケープシーケンスで赤くする
sed で (赤くする)エラー出力(戻す)
みたいな感じにする
exec
exec > hoge.txt date ls
引数にコマンドが無い exec は、これ以降のすべてのコマンドの出力をリダイレクトするという内部コマンド。
(リダイレクトが主目的ではないが、リダイレクト以外に使う人はいない)
例の場合は date, ls の結果を hoge.txt に保存する
>(コマンド)
リダイレクトされた出力を サブシェル(かっこの中のコマンド)の標準入力に繋げる
# パイプで受け取る cat hoge.txt | grep piyo # リダイレクトされた出力を 標準入力として受け取る cat hoge.txt > >(grep piyo)
$''
$'' はbashでエスケープシーケンスを置換する。
ただの '' で渡すのがシンプルで良いけど、文字数を少なくしてみたかった。
sed -u $'s/.*/\e[31m&\e[0m/' sed -u 's/.*/\x1b[31m&\x1b[0m/'
sedでは \e という表現が使えないが \x1bなら使える。(\033はNG)
&
sed では、& がマッチした文字列になる。
ようするに全文になる
sed -u
-uはsedの結果出力をバッファしないオプション
サブシェルを実行しているので、これをつけないと 最後のエラー出力が表示される前に もとのシェルの実行が終わって 次のプロンプトが先に出てしまう
参考:
標準エラー出力を赤くする - 揮発性のメモ2
プログラムの標準出力を別のプログラムの標準入力に渡す - 揮発性のメモ2
flockコマンドをflock関数みたいに使う 2 - 揮発性のメモ2