1. ホーム
  2. バッシュ

[解決済み】シェルスクリプトがパイプを介して実行されているかどうかを検出するにはどうすればよいですか?

2022-03-29 02:53:40

質問

シェルスクリプトの標準出力がターミナルに送信されているか、他のプロセスにパイプされているかを検出するにはどうすればよいですか?

例えば、出力を着色するためにエスケープコードを追加したいのですが、対話的に実行したときだけで、パイプで接続したときには着色しないようにします。 ls --color が行っています。

どのように解決するのですか?

純粋なPOSIXシェルで。

if [ -t 1 ] ; then echo terminal; else echo "not a terminal"; fi

は "terminal" を返し、出力がターミナルに送られるからです。

(if [ -t 1 ] ; then echo terminal; else echo "not a terminal"; fi) | cat

は "端末ではない" を返します。これは親要素の出力が cat .


-t フラグは、manページで次のように説明されています。

-t fd ファイル記述子 fd が開いていて、端末を参照している場合、真。

... ここで fd には、通常のファイル記述子の割り当てのいずれかを指定することができます。