テストのために記述子を -t 端末として表示

テストのために記述子を -t 端末として表示

-t testを使用して、記述子が端末に接続されているかどうかをテストできます。

if [ ! -t 0 ]; then
    echo "Stdin is not from terminal"
fi

ファイルまたはプロセスを指す記述子Xがあります(>(cmd)リダイレクトを使用)。端末のように見せることができますか?テストに合格するには -t?

答え1

代わりにパイプの代わりにttyになりたいのが標準入力であると仮定すると、>(cmd)次のことを試すことができます。cmd

>(socat -u - exec:'cmd',pty)

socatpseudo-ttyペアを使用してcmdstdinをスレーブ部分に接続します([ -t 0 ]それからtrueを返します)。

擬似ターミナルは生モードに切り替わるため、ラインルールがデータを妨害しないようにするため、その点でパイプとほぼ同じです。

しかし、擬似端子はパイプのように一端でのみ閉じることはできません。したがって、入力がないとは限りsocatません。cmd代わりに、socatstdinがファイルの終わりに達した後socatしばらく待ってからpseudo-ttyを削除します。これは通常cmdSIGHUPを受信することを意味します。

コマンドがデータの処理に時間がかかる場合や、操作の実行を開始する前に標準入力からファイルが終了するのを待つと、コマンドは正常に機能しません。

答え2

このコマンドは、記述子がTTYに関連付けられていることを確認するためにtest実行されます。isatty(fd)

isatty(3)ファイル記述子がioctl(2)端末呼び出しを記述子に送信できるかどうかを確認する C ライブラリ関数。

LD_PRELOAD=したがって、isatty()シェルでオーバーライド機能を使用しないと、結果を偽にすることはできません。

関連情報