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

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

を実行すると、cat端末はstdinの入力を待って停止します。しかしless、投稿されたとき、私はそれを得ましたMissing filename ("less --help" for help)。私たちは皆知っているように、less標準入力入力の両方をcat許可します。違いは何ですか?これはマニュアルページにどのように反映されますか?

答え1

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

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

標準入力が端末の場合は文句を言います。標準入力が通常のファイルやパイプであれば大丈夫です。

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

マニュアルページにはこれに対する言及はありません。おそらくそうすべきでしょう。

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

答え2

私の考えでは、ファイル記述子0lessisatty(3)。別のオプションは、ファイル記述子0を呼び出し、fstat(2)合計フィールドの値を解釈することです。どちらにしても、ポイントはプログラムがファイル記述子に関する情報を知らせることができ、stdinはファイル記述子0にすぎないことです。st_inost_rdev

lessやめなければならない理由とやめてはいけない理由については、catこれら2つの異なるプログラムの目的を調べる必要があります。lessこれはBSDポケットベルへの反応であるGNUポケットベルですmore(名前には遊び心があります)。端末の入力にページを付けるのはまったく意味がありませんが、パイプの入力にページを付けるのは意味があるかもしれません。どちらも標準入力にすることができます。特別なケースを書くのがless合理的です。特別なケースをコーディングすることはcat意味がなく、使いやすさを減らします。 1980年代後半にも、人々はWindowsシステムを使用してcat > somefile「somefile」にテキストの塊を入力して貼り付けました。

関連情報