grcはpythonスクリプトで構成されていたみたいだけども、sflowtool*1みたいな出力大量なものの場合に、色出力部分は魔改造(すなわちc言語での直接改造)したほうがいい場合がある。
なにも気にしないでエスケープシーケンスの色制御コードを追加すればそれで色が付く。だけども、行儀よくやる場合は、端末に直接出力する場合には、色制御コードを足す、そうでない場合(パイプ出力・リダイレクトの場合)には色制御コードは出力しない、のがよりよい。昔、lsコマンドを例題にしてそんなやり方を教わった。
こんなのインクルードして
#include <termios.h> #include <sys/ioctl.h>
こんなんで、端末に出力かどうかの有無を判定
#ifdef TIOCGWINSZ { struct winsize ws; if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) line_length = ws.ws_col; } #endif
command | lessとかパイプをつないだ場合にはioctl (STDOUT_FILENO, TIOCGWINSZ,..)は-1を返してくる。端末出力であると判断できたらstdoutへの出力にエスケープシーケンスの色制御を追加してあげる、という寸法。
Unix Magazineとかで見たのだったかなぁ。。
(2021/06/04追記) pythonでする場合
*1:例で思いつくものがこれだった。。