多くの人々は、ラインに沿ってコードを含むonelinersとスクリプトを使用します
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
cat
技術的には/usr/bin/cat
、コマンドが実行された場合にこれを回避できる新しいプロセス(多くの場合)を開始する必要があるため、最初は「catの無駄な使用」と呼ばれます。
< "$MYFILE" command1 | command2 > "$OUTPUT"
シェルは起動するcommand1
だけでstdin
、指定されたファイルをポイントするだけです。
シェルがこの変換を自動的に行わないのはなぜですか?「猫の無用な使用」構文は読みやすく、無用な猫を自動的に取り除くのに十分な情報がシェルにあるはずです。cat
シェルはパスにバイナリを使用する内部代わりに、それを実装することができなければならないので、POSIX規格で定義されています。シェルには、1つの引数バージョンのみの実装と、パス内のバイナリへのフォールバックさえ含めることができます。
lseek
など、まだ動作が定義され、異なる結果を引き起こす可能性が、異なるブロッキング動作は意味的に意味のあることができ、あなたが知っていた場合には、変更を行うことが許容だろう他のコマンドであったと、彼らは気にしませんでした知っていました、または、そのレベルで互換性を気にしなかったが、その利点はかなり小さい場合。私は、利益の欠如が適合コストよりも状況を促進すると想像しています。
cat
ただし、シェルは、それ自体または他のユーティリティを絶対に実装できます。また、システムに属する他のユーティリティがどのように機能するかを知ることができます(たとえば、システムに付属する外部grep
実装がどのように動作するかを知ることができます)。これは完全に実行可能ですので、なぜ実行しないのか不思議に思うでしょう。
grep
。そしてsed
。そしてawk
。そしてdu
。そして、他の何千ものユーティリティではないにしても、何百ものユーティリティですか?