-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)
socat
pseudo-ttyペアを使用してcmd
stdinをスレーブ部分に接続します([ -t 0 ]
それからtrueを返します)。
擬似ターミナルは生モードに切り替わるため、ラインルールがデータを妨害しないようにするため、その点でパイプとほぼ同じです。
しかし、擬似端子はパイプのように一端でのみ閉じることはできません。したがって、入力がないとは限りsocat
ません。cmd
代わりに、socat
stdinがファイルの終わりに達した後socat
しばらく待ってからpseudo-ttyを削除します。これは通常cmd
SIGHUPを受信することを意味します。
コマンドがデータの処理に時間がかかる場合や、操作の実行を開始する前に標準入力からファイルが終了するのを待つと、コマンドは正常に機能しません。
答え2
このコマンドは、記述子がTTYに関連付けられていることを確認するためにtest
実行されます。isatty(fd)
isatty(3)
ファイル記述子がioctl(2)
端末呼び出しを記述子に送信できるかどうかを確認する C ライブラリ関数。
LD_PRELOAD=
したがって、isatty()
シェルでオーバーライド機能を使用しないと、結果を偽にすることはできません。