項目のリストをリストする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です。
- スクリプトがパイプラインの先頭で実行され、
stdin
TTYstderr
の場合 - スクリプトがパイプラインの途中で実行される場合、
stderr
TTY - スクリプトがパイプの最後で実行され、
stdout
TTYstderr
の場合
それはすべて論理的なようです。stderr
パイプもリダイレクトされると、明らかに動作が異なります。
あなたの質問に完全に答えるためにすべてのケースで端末の特性を決定することは可能であるとは思わないが、実行/dev/fd
可能なTTYであるFD(すべての項目を確認)を見つけることができればstty
...しかし、パイプの中央からパイプの端の方向を決定することは不可能です。
言ったようにジャニス、パイプに関係なく制御端末に関する情報を知りたい場合は/dev/tty
、例えばとstty -F /dev/tty
;ただし、制御端末なしでスクリプトを実行すると失敗します。例えば職場でcron
。