リダイレクトされているかどうか知りたい
出力がリダイレクトされているかどうかを調べる.これはファイルディスクリプタをチェックすればわかる.
ファイルディスクリプタからリダイレクト先が端末かどうかを調べるには,isattyシステムコールを使用する.これはunistd.hで宣言されている.そしてファイルディスクリプタはfileno関数で取得できる.
これを実行すると以下のようになる.
$> ./a.out stdout is a terminal $> ./a.out > /dev/null stdout is not a terminal簡単.
先のサンプルでは,stdoutがリダイレクトされているかどうかをチェックしてその結果をstderrに出力した.この方法では,stderrがリダイレクトされていると,端末には何も表示されない.stdoutやstderrのリダイレクトにかかわらず端末に表示するには,/dev/ttyをオープンしてそれに書き込む./dev/ttyは現在の端末を意味し,通常のファイルと同様に読み書きができる.先のサンプルを変更してstdoutとstderrがリダイレクトされているかどうかをチェックするようにしみた.
実行結果を以下に示す.
$ ./a.out stdout is a terminal stderr is a terminal $ ./a.out > hoge stdout is not a terminal stderr is a terminal $ ./a.out 2> hoge stdout is a terminal stderr is not a terminal $ ./a.out &> hoge stdout is not a terminal stderr is not a terminal

