いくつかのプログラムでstdinからのデータの読み取りが異なるのはなぜですか?

いくつかのプログラムでstdinからのデータの読み取りが異なるのはなぜですか?

私はstdinで読むためのncursesプログラムを開発しています。しかし、他のプログラムがこれを行う方法を確認している間、一貫性がないことがわかりました。たとえば、次の2つは正常に機能します。

tail file.txt | cat
tail file.txt | cat -

たとえに慣れる私が使用しない限り-

cat file.txt | vim
cat file.txt | file

-なぜ一部のプログラムではパイピングデータを受け入れ、一部では許可しないのですか?理由がありますか?どちらもサポートする必要がありますか?

答え1

として行動する予定フローフィルタ、一部の入力ソースからデータを取得し、段階的に処理し、出力を生成します。通常、オプション引数ではなく呼び出し時に標準入力から読み取られます。たとえば、cat背中はtail基本的に標準入力から読み取ることです。grep、その他のツールにはsedオペランド(grepの場合は正規表現、sedの場合はスクリプト)が必要です。これが唯一のオペランドの場合は標準入力から読み取られます。 Vi(m)はこのモードには適していません。これはストリームフィルタではなく対話型プログラムなので、引数を渡さないと対話型モードで起動します。

file-例外です。 stdinが引数として提供されない限り(おそらく構文を介して)stdinから読み込まれません。なぜ原作者やPOSIX委員会ともにstdinで読まないことを決めたのか分からない。これはfile、ファイルの内容だけでなく、ファイル形式(レポートがディレクトリなのか  file foofoo一般的なファイルなのか、シンボリックリンクなのかなど)にも興味があるからです。したがって、一般的に使用されるフィルタですが、厳密に言えば、他のフィルタと同じフローフィルタではありません。grep(ストリームフィルタ)とls(ファイルの内容ではなくディレクトリエントリとしてファイルのみを考慮)の間にあります。

grep -rファイル形式にも興味がありますが、元のコマンドよりはるかに遅く追加されました。)

関連情報