「less」はユーザーからのコマンドを読み取りながら、stdinからデータを取得する方法


47

ほとんどの人が何度も行っているように、長いテキストを表示するにはless次を使用すると便利です。

some_command | less

現在、そのstdinはパイプ(FIFO)に接続されています。up / down / quitなどのコマンドをどのように読み取ることができますか?


15
lessstdinから表示するデータを読み取り、ttyからコマンドを読み取ります。それらは異なるものです。
ウィリアムパーセル

2
@WilliamPursellうん、知ってるよ。しかし、標準入力ストリームは1つだけですよね?
iBug

4
はい、1つの入力ストリームと1つのttyがあります。 lessstdinからデータを読み取り、ttyからコマンドを読み取ります。
ウィリアムパーセル

回答:


52

で述べたように、ウィリアムPursellless端末からユーザーのキーストロークを読み込みます。/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など、提案によってハーゲン・フォン・Eitzenless開口部に成功します/dev/ttyが、それまでの任意の入力を取得することはありませんcatが閉じて。そのため、画面を空白にして、押す(または他の方法でCtrlC殺すcat)を押すまで何も表示されません。その後、lessあなたは一方で入力したものは何でも表示されますcat実行している、とあなたはそれを制御することができました。


4
@HagenvonEitzenお使いのコンピューターが爆発します!カークとスポックがマッドのアンドロイドをクラッシュさせたようなものです。
バーマー

7
@HagenvonEitzenうわー。catの二重に役に立たない使用。私が感銘を受けた。
アンドリューヘンレ

8
@grawity Andrewのポイントはでcat blah |置き換えることができると思いますが< blah、この場合も機能するのでそれは不要ですless blah(まあ、less -f /dev/tty)。ただし、からの読み取り/dev/ttyは少し特殊なケースであり、3つのバリアント(cat /dev/tty | lessless < /dev/ttyおよびless -f /dev/tty)はすべて異なる結果を生成します。
スティーブンキット

1
/ dev / ttyは常に何らかの形で正しい場所を指し示していますか?通常、/ dev / ptsXを使用する必要があると思いますか?
-StarWeaver

2
参照@StarWeaver この質問の違いについて/dev/ttyなどを/dev/pts/...
スティーブンキット

26

UNIXには、stdinがリダイレクトされている間にユーザー入力を読み取るための2つの方法があります。

  • 元の方法はstderrから読み取ることです。Stderrは書き込みおよび読み取り用に開かれていますが、これはPOSIXでも引き続き言及されています。

  • それ以降のUNIXバージョンでは(1979年頃)/dev/tty、プロセスの制御ttyを開くことができるドライバーインターフェイスが追加されました。制御ttyのないプロセスがあるため、開く試みが/dev/tty失敗する可能性があります。したがって、わかりやすいソフトウェアは、元のメソッドにフォールバックしてから、stderrから読み取ろうとします。


11
stderrから読み取りますか?新しいことを学びました。
iBug

1
誰かが古い方法を覚えてくれてうれしいです。
ジョシュア

3
stderrがリダイレクトに使用される可能性が最も低いため、読み取りにstderrが使用されるのはなぜですか?私はそれとstdout(またはリダイレクトの前のその標準stdin)の他の違いを見ません。
ctrl-alt-delor

4
はい、これはリダイレクトされる可能性が最も低いファイル記述子であるためです。
18年

@ ctrl-alt-delor:シェルがstdin、stdout、stderrで実行されるのは典型的でしたが、すべてdup()同じファイル記述のlicatesですが、すべてttyで開かれています。(stderrのようなもので開かれていない、読み取り/書き込みFDであること)どうやらPOSIXはまだ必要ですか。この答えは言いません(提案open("/dev/ttyS0", O_WRONLY)リーディングstderrが、その場合には失敗します。)
ピーター・コルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.