ほとんどの人が何度も試したように、次のコマンドを使用すると長いテキストを表示するのが便利ですless
。
some_command | less
これで、標準入力がパイプ(FIFO)に接続されます。 up/down/exitのようなコマンドをどのように読み続けますか?
答え1
言ったようにウィリアム・パーセル、less
端末からユーザーのキーストロークを読みます。これは/dev/tty
制御端末を明示的に開きます。これは、ユーザーの対話型入力を読み取ることができる標準入力とは別にファイル記述子を提供します。必要に応じて、表示用の標準入力から同時にデータを読み取ることができます。 (また書く必要に応じて端末に直接移動してください。 )
以下を実行すると、このようなことが発生することがわかります。
some_command | strace -o less.trace -e open,read,write less
入力を移動して終了し、less
内容を見てください。ファイルディスクリプタ0と開いたときに返されるファイルディスクリプタ(おそらく3)でless.trace
開いて読み取ることがわかります。/dev/tty
/dev/tty
これは、端末で読み書きできるようにするプログラムの一般的な慣行です。たとえば、SSHです。例えばパスワードやパスワードのフレーズを尋ねる場合。
〜のように説明した渡す狡猾な、/dev/tty
開くことができない場合は、less
標準エラー(ファイル記述子2)から読み取られます。less
の使用は、/dev/tty
1991年4月2日にリリースされたバージョン177で導入されました。
cat /dev/tty | less
次のように走ろうとすると提案渡すハーゲンフォンアイゼン、less
正常に開きますが、/dev/tty
閉じるまで入力を受け取りません。したがって、kill(またはkill)をcat
押すまでは何もない空の画面が表示され、ランタイム中に入力した内容が表示され、これを制御できます。CtrlCcat
less
cat
答え2
標準入力がリダイレクトされると、UNIXはユーザー入力を読み取る2つの方法を提供します。
元の方法は読むことです。標準エラー。 Stderrは執筆のために開いていますそしてお読みください。 POSIXではまだ言及されています。
以降のバージョンのUNIX(1979年頃)には、
/dev/tty
プロセスの制御ttyを開くことができるドライバインタフェースが追加されました。 ttyを制御しないプロセスがあるため、開こうとすると/dev/tty
失敗します。したがって、おなじみの書き込みソフトウェアは元の方法に戻り、stderrから読み取ろうとします。