シェルパイプラインのコマンドがそのコンテキストのtty属性を決定できますか?

シェルパイプラインのコマンドがそのコンテキストのtty属性を決定できますか?

項目のリストをリストするbashスクリプトがあります。デフォルトでは、報告された端末幅に基づいて出力される列数を推測しますstty size。ただし、スクリプトがパイプラインにある場合は、stty「デバイスに不適切なioctl」が報告されます。

私が望むのは、私のスクリプトがパイプの途中でコマンドとして実行されたときに、それが属するパイプが最終的にttyに出力されるかどうかを発見し、もしそうなら、その属性をsttyできるようにすることです。

回避策:以下に説明するように、stty -F /dev/ttyパイプラインのどこでも動作するようです。

答え1

次のスクリプトを使用して試すことができます。

#!/bin/sh

for fd in 0 1 2; do
    if [ -t $fd ]; then echo $fd is a TTY; fi
done

これを実行すると、次のようになります。

  • スクリプトが個別に実行される場合、3つのFDはすべてTTYです。
  • スクリプトがパイプラインの先頭で実行され、stdinTTYstderrの場合
  • スクリプトがパイプラインの途中で実行される場合、stderrTTY
  • スクリプトがパイプの最後で実行され、stdoutTTYstderrの場合

それはすべて論理的なようです。stderrパイプもリダイレクトされると、明らかに動作が異なります。

あなたの質問に完全に答えるためにすべてのケースで端末の特性を決定することは可能であるとは思わないが、実行/dev/fd可能なTTYであるFD(すべての項目を確認)を見つけることができればstty...しかし、パイプの中央からパイプの端の方向を決定することは不可能です。

言ったようにジャニス、パイプに関係なく制御端末に関する情報を知りたい場合は/dev/tty例えばstty -F /dev/tty;ただし、制御端末なしでスクリプトを実行すると失敗します。例えば職場でcron

関連情報