ほとんどの人が何度も行っているように、less
を使用して長いテキストを表示すると便利です。
some_command | less
これで、そのstdinはパイプ(FIFO)に接続されました。どうすればup/down/quitなどのコマンドを読み取ることができますか?
William Pursell で述べたように、less
はターミナルからユーザーのキーストロークを読み取ります。制御端末である/dev/tty
を明示的に開きます。これにより、標準入力とは別のファイル記述子が提供され、そこからユーザーのインタラクティブ入力を読み取ることができます。必要に応じて、標準入力から表示するデータを同時に読み取ることができます。 (必要に応じて、端末に直接writeすることもできます。)
あなたはこれを実行して見ることができます
some_command | strace -o less.trace -e open,read,write less
入力を移動してless
を終了し、less.trace
の内容を確認します。/dev/tty
が開いていることがわかり、ファイル記述子0と、返されたファイル記述子0の両方から読み取られます。 /dev/tty
を開きました(おそらく3)。
これは、端末からの読み取りと端末への書き込みを確実に行いたいプログラムの一般的な方法です。 1つの例は、SSHですたとえばパスワードまたはパスフレーズを要求されたとき。
説明schily によって、/dev/tty
を開けない場合、less
は標準エラー(ファイル記述子2)から読み取ります。 less
による/dev/tty
の使用は、1991年4月2日にリリースされたバージョン177で導入されました。
Suggested by Hagen von Eitzen としてcat /dev/tty | less
を実行しようとすると、less
は/dev/tty
を開くことに成功しますが、失敗しますcat
が入力を閉じるまで、入力を取得します。したがって、画面が空白になり、押すまで何も表示されません。 CtrlC cat
を殺す(または他の方法で殺す)。次に、less
は、cat
の実行中に入力したものをすべて表示し、それを制御できるようにします。
UNIXは、stdinがリダイレクトされている間にユーザー入力を読み取るための2つの方法を提供します。
元の方法はstderrから読み取ることです。 Stderrは書き込み用に開いていますand読み取り、これはまだPOSIXで言及されています。
以降のUNIXバージョンでは(1979年頃)、プロセスの制御ttyを開くことができる/dev/tty
ドライバインターフェイスが追加されました。制御ttyのないプロセスがあるため、/dev/tty
を開こうとすると失敗する可能性があります。したがって、フレンドリーなソフトウェアは元の方法にフォールバックし、stderrから読み取ろうとします。