“ちなみにかしこくて、grepとかをかけると、ww なしでも全部表示されます。” どういう仕組みなんだろ。stdoutがパイプか判定してるとかかな。 / “あなたはps -ef派なのか、auxf派なのかをちょっとだけまとめてみた | https://t.co/mbDaaXFdMc” https://t.co/BXPnPjyIPJ
— Ryuichi@k8s再入門中 (@ryuichi_1208) 2021年6月20日
謎な技術だったので調べた。結論としてはisattyのようなライブラリ関数を使うかfstatでstdoutのステータスを判定すれば良さそう
#include <stdio.h> int main(int argc, char **argv) { if (isatty(fileno(stdout))) printf( "stdin is a terminal\n" ); else printf( "stdin is a file or a pipe\n"); }
みたいに書いておけばstdoutの後続にパイプがあれば出力を抑制なり整形するみたいな処理を書くことができる。
fstatならマクロを使う。
struct stat stats; fstat(0, &stats); if (S_ISCHR(stats.st_mode)) { // Looks like a tty, so we're in interactive mode. } else if (S_ISFIFO(stats.st_mode)) { // Looks like a pipe, so we're in non-interactive mode. }