52103


いくつかの cli ツールでは、標準出力が端末 (tty?) に繋がっている場合に、その挙動が変化するツールがあります。

たとえば、 redis-cli がそうで、端末上で `redis-cli keys '*'` を実行すると、 human readable
な形式で出力されますが、その出力をパイプにつないだ場合には、 machine readable な形式の出力になります。

[code]

     % redis-cli keys '*'
    1) "foo"
    
     % redis-cli keys '*' | cat      
    foo
    
[/code]

このような挙動を、ふと、シェルスクリプトで再現したくなりました。

### 質問

標準出力が端末に繋がっているかどうかを、シェルスクリプトから判定することはできますか？


CC BY-SA 4.0
2019-01-19T04:25:10.327
52100
2019-01-19T06:12:24.357
754
question
unix sh
シェルスクリプトで、標準出力が端末の場合に挙動を変化させたい


testコマンドの -t オプションで判定できるようです。

[Linux基本コマンドTips（222）：【 test
】コマンド（応用編）――文字列の一致などを判定する](http://www.atmarkit.co.jp/ait/articles/1807/12/news012.html)

> testの主なオプションと式（標準入出力の判定）  
>  式 真になる条件  
>  -t 0 標準入力が端末  
>  -t 1 標準出力が端末  
>  -t 2 標準エラー出力が端末  
>  -t 数値 数値番目のファイルディスクリプターが端末

こちらも。  
[test - コマンド (プログラム) の説明 - Linux コマンド集
一覧表](https://kazmax.zpp.jp/cmd/t/test.1.html)

> -t [fd ]  
>  fd が端末でオープンされていれば真。 fd が省略された場合のデフォルト値は 1 (標準出力)。


CC BY-SA 4.0
2019-01-19T04:46:46.503
52103
2019-01-19T04:46:46.503
26370
52100
answer


`test`コマンドの`-p`オプションを利用する方法もあります。  
`test -p /dev/stdout`が真になるとき`/dev/stdout`は名前付きパイプです。なのでその出力はパイプで繋がっている先に流れます。


CC BY-SA 4.0
2019-01-19T06:12:24.357
52108
2019-01-19T06:12:24.357
25936
52100
answer