以下の内容はhttps://iww.hateblo.jp/entry/20250909/stderrより取得しました。


標準エラー出力を赤くする2

スクリプトで、標準エラー出力を自動で赤く表示する

#!/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 では、& がマッチした文字列になる。
ようするに全文になる

\e[31m

エスケープシーケンス 内容
\e[31m 文字の色を赤にする
\e[0m 文字の色を元にもどす

この間に赤くしたい文字列を挟む

>&2

標準エラー出力に出力する
そのままだとsedの結果は標準出力に出るが、標準エラー出力が標準出力に出るのも良くない気がするので一応

sed -u

-uはsedの結果出力をバッファしないオプション
サブシェルを実行しているので、これをつけないと 最後のエラー出力が表示される前に もとのシェルの実行が終わって 次のプロンプトが先に出てしまう


参考:
標準エラー出力を赤くする - 揮発性のメモ2
プログラムの標準出力を別のプログラムの標準入力に渡す - 揮発性のメモ2
flockコマンドをflock関数みたいに使う 2 - 揮発性のメモ2




以上の内容はhttps://iww.hateblo.jp/entry/20250909/stderrより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14