シェル スクリプト内から、標準出力が端末に送信されているか、別のプロセスにパイプされているかを検出するにはどうすればよいでしょうか。
具体例: 出力を色付けするためにエスケープ コードを追加したいのですが、これは対話的に実行する場合のみで、パイプする場合は追加しませんls --color
。
ベストアンサー1
純粋なPOSIXシェルでは、
if [ -t 1 ] ; then echo terminal; else echo "not a terminal"; fi
出力は端末に送信されるため、「端末」を返しますが、
(if [ -t 1 ] ; then echo terminal; else echo "not a terminal"; fi) | cat
括弧内の要素の出力が にパイプされるため、「端末ではない」が返されますcat
。
この-t
フラグはマニュアルページで次のように説明されている。
-t fd ファイル記述子 fd が開かれており、端末を参照している場合は True になります。
...ここでは、fd
通常のファイル記述子の割り当てのいずれかになります。