実行時に標準出力がパイプされているかどうか判断するにはisattyを使う

  • 17
    Like
  • 0
    Comment
More than 1 year has passed since last update.

MySQLコマンドに -e オプションでSQLを渡すと、その結果が標準出力されますよね

% mysql -e 'SELECT * FROM life;'
+------------------------+
| カルマ                 |
+------------------------+
| リア充爆発しろ         |
| 他人の不幸で飯がうまい |
+------------------------+

でも、これをパイプで受け取ると中身が変わるんです。

% mysql -e 'SELECT * FROM life;' | cat
カルマ
リア充爆発しろ
他人の不幸で飯がうまい

これどうやってんのかなと調べてみたら、標準出力がttyに結合してるかどうかを返す isatty なる関数が存在することを知りました。MySQLはこれの値を見て書きだす値を変更しているらしい。

で、これをRubyで書くとこんな感じで区別できる。

isatty.rb
puts STDOUT.isatty

実行してみる

% ruby isatty.rb
true
% ruby isatty.rb | cat
false

なるほどー