「cat」と「less」間の標準入力の動作

「cat」と「less」間の標準入力の動作

を発行するとcat、ターミナルは stdin 入力を待ってハングします。しかし、lessを発行すると が表示されますMissing filename ("less --help" for help)lessと はどちらもcatstdin 入力を受け入れることが知られています。違いは何でしょうか? これは man ページにどのように反映されますか?

答え1

lessファイル名引数が指定されていない場合は、次のコードを実行します。

if (isatty(fd0))
{
    error("Missing filename (\"less --help\" for help)", NULL_PARG);
    quit(QUIT_OK);
}
return (edit("-"));

標準入力が端末の場合、エラーが出ます。標準入力が普通のファイルやパイプの場合は問題ありません。

おそらく、各ページの最後に端末からの応答を読み取る必要があり、ページングされているデータと応答を区別する方法がないため、このようにするのでしょう。

これはマニュアルページには記載されていません。記載すべきかもしれません。

cat出力をページングせず、端末からの応答を読み取りません。stdin が端末である限り、制限はありません。

答え2

私の推測では、 はファイル記述子 0 をless呼び出しますisatty(3)。別の方法としては、ファイル記述子 0 を呼び出し、フィールドとフィールドfstat(2)の値を解釈します。いずれにしても、ポイントは、プログラムがファイル記述子について何かを伝えることができ、stdin は単にファイル記述子 0 であるということです。st_inost_rdev

lessが終了する理由と終了しない理由についてはcat、2 つの異なるプログラムの目的を確認する必要があります。lessは GNU ページャーで、BSD ページャーへの反応ですmore(しゃれの名前に注意してください)。端末からの入力をページ区切りにするのはまったく意味がありませんが、パイプからの入力をページ区切りにするのは意味があるかもしれません。どちらも stdin にすることができます。 で特別なケースをコーディングするのはless意味があります。 で特別なケースをコーディングするのはcat意味がなく、その有用性が低下します。 1980 年代後半でも、人々はウィンドウ システムを使用していて、 を入力してcat > somefileから大量のテキストを "somefile" に貼り付けていました。

関連情報