回答:
で述べたように、ウィリアムPursell、less
端末からユーザーのキーストロークを読み込みます。/dev/tty
制御端末を明示的に開きます。これは、ユーザーの対話型入力を読み取ることができる標準入力とは別のファイル記述子を提供します。必要に応じて、標準入力から表示するデータを同時に読み取ることができます。(必要に応じて、端末に直接書き込むこともできます。)
これを実行すると、次のようになります。
some_command | strace -o less.trace -e open,read,write less
入力を移動し、exit less
、およびの内容をless.trace
見てください。openが表示され/dev/tty
、ファイル記述子0と、開いたときに返されたファイル記述子/dev/tty
(おそらく3)の両方から読み取ります。
これは、端末からの読み取りおよび端末への書き込みを確実に行うことを望むプログラムの一般的な方法です。一つの例は、SSH、ある例えばそれは、パスワードやパスフレーズを要求する場合。
説明によってシリー、あれば/dev/tty
開くことができない、less
その標準エラー(ファイルディスクリプタ2)から読み込まれます。less
の使用は/dev/tty
、1991年4月2日にリリースされたバージョン177で導入されました。
あなたが実行してみる場合cat /dev/tty | less
など、提案によってハーゲン・フォン・Eitzen、less
開口部に成功します/dev/tty
が、それまでの任意の入力を取得することはありませんcat
が閉じて。そのため、画面を空白にして、押す(または他の方法でCtrlC殺すcat
)を押すまで何も表示されません。その後、less
あなたは一方で入力したものは何でも表示されますcat
実行している、とあなたはそれを制御することができました。
cat blah |
置き換えることができると思いますが< blah
、この場合も機能するのでそれは不要ですless blah
(まあ、less -f /dev/tty
)。ただし、からの読み取り/dev/tty
は少し特殊なケースであり、3つのバリアント(cat /dev/tty | less
、less < /dev/tty
およびless -f /dev/tty
)はすべて異なる結果を生成します。
UNIXには、stdinがリダイレクトされている間にユーザー入力を読み取るための2つの方法があります。
元の方法はstderrから読み取ることです。Stderrは書き込みおよび読み取り用に開かれていますが、これはPOSIXでも引き続き言及されています。
それ以降のUNIXバージョンでは(1979年頃)/dev/tty
、プロセスの制御ttyを開くことができるドライバーインターフェイスが追加されました。制御ttyのないプロセスがあるため、開く試みが/dev/tty
失敗する可能性があります。したがって、わかりやすいソフトウェアは、元のメソッドにフォールバックしてから、stderrから読み取ろうとします。
dup()
同じファイル記述のlicatesですが、すべてttyで開かれています。(stderrのようなもので開かれていない、読み取り/書き込みFDであること)どうやらPOSIXはまだ必要ですか。この答えは言いません(提案open("/dev/ttyS0", O_WRONLY)
リーディングstderrが、その場合には失敗します。)
less
stdinから表示するデータを読み取り、ttyからコマンドを読み取ります。それらは異なるものです。