を実行すると、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
私の考えでは、ファイル記述子0less
がisatty(3)
。別のオプションは、ファイル記述子0を呼び出し、fstat(2)
合計フィールドの値を解釈することです。どちらにしても、ポイントはプログラムがファイル記述子に関する情報を知らせることができ、stdinはファイル記述子0にすぎないことです。st_ino
st_rdev
less
やめなければならない理由とやめてはいけない理由については、cat
これら2つの異なるプログラムの目的を調べる必要があります。less
これはBSDポケットベルへの反応であるGNUポケットベルですmore
(名前には遊び心があります)。端末の入力にページを付けるのはまったく意味がありませんが、パイプの入力にページを付けるのは意味があるかもしれません。どちらも標準入力にすることができます。特別なケースを書くのがless
合理的です。特別なケースをコーディングすることはcat
意味がなく、使いやすさを減らします。 1980年代後半にも、人々はWindowsシステムを使用してcat > somefile
「somefile」にテキストの塊を入力して貼り付けました。