ユーザーコマンドを読み取ることができますが、標準入力からデータを「少なく」取得する方法は何ですか?

ユーザーコマンドを読み取ることができますが、標準入力からデータを「少なく」取得する方法は何ですか?

ほとんどの人が何度も試したように、次のコマンドを使用すると長いテキストを表示するのが便利です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/tty1991年4月2日にリリースされたバージョン177で導入されました。

cat /dev/tty | less次のように走ろうとすると提案渡すハーゲンフォンアイゼンless正常に開きますが、/dev/tty閉じるまで入力を受け取りません。したがって、kill(またはkill)をcat押すまでは何もない空の画面が表示され、ランタイム中に入力した内容が表示され、これを制御できます。CtrlCcatlesscat

おすすめ記事