![「cat」と「less」間の標準入力の動作](https://rvso.com/image/36024/%E3%80%8Ccat%E3%80%8D%E3%81%A8%E3%80%8Cless%E3%80%8D%E9%96%93%E3%81%AE%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B%E3%81%AE%E5%8B%95%E4%BD%9C.png)
を発行するとcat
、ターミナルは stdin 入力を待ってハングします。しかし、less
を発行すると が表示されますMissing filename ("less --help" for help)
。less
と はどちらもcat
stdin 入力を受け入れることが知られています。違いは何でしょうか? これは 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_ino
st_rdev
less
が終了する理由と終了しない理由についてはcat
、2 つの異なるプログラムの目的を確認する必要があります。less
は GNU ページャーで、BSD ページャーへの反応ですmore
(しゃれの名前に注意してください)。端末からの入力をページ区切りにするのはまったく意味がありませんが、パイプからの入力をページ区切りにするのは意味があるかもしれません。どちらも stdin にすることができます。 で特別なケースをコーディングするのはless
意味があります。 で特別なケースをコーディングするのはcat
意味がなく、その有用性が低下します。 1980 年代後半でも、人々はウィンドウ システムを使用していて、 を入力してcat > somefile
から大量のテキストを "somefile" に貼り付けていました。