一部のコマンドでは、特定の入力をstdinまたはコマンドライン引数として指定できます。
具体的には、command
stdin入力とファイル名をコマンドライン引数として渡すことができ、command < myfile
同じcat myfile | command
結果をcommand myfile
生成できると仮定します。
例えば、
コマンドは次のとおりですsed
。
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
コマンドは次のとおりですcat
。
cat < myfile
cat myfile
- パフォーマンスに関するいくつかの一般的なルールがあるかどうか疑問に思います。つまり、一般的にどれが最も効率的で、どれが最も効率が悪いのでしょうか。
- リダイレクトは常にパイプより優れていますか?
ベストアンサー1
このcat file | command
文法が考慮されます。役に立たない使用Cat
。すべてのオプションのうち、カーネルに異なるプロセスを作成する必要があるため、パフォーマンスに影響を与えます。ただし、これは大きな計画ではマイナーに見えるかもしれませんが、他の形式にはないオーバーヘッドがあります。これにはすでに次の問題が含まれています。望ましくない猫に興味を持たなければなりませんか?
他の2つの形式の間にパフォーマンスの違いはほとんどありません。 STDINは、プロセスが他のファイルのように開いて読み取る必要がある特別なファイルノードです。 STDINの代わりにファイル名を渡すと、別のファイルが開きます。
違いは望ましい機能/柔軟性です。
- プログラムにファイル名を渡すことは、入力ファイルを検索できることを意味します。これはプログラムにとって重要でも重要ではないかもしれませんが、ストリームを検索できる場合は、一部のジョブの速度が速くなる可能性があります。
- 実際の入力ファイルを知ると、プログラムはそのファイルに書き込むことができます。たとえば、
sed -i
内部編集の場合です。 (注:バックグラウンドで新しいファイルを作成する必要があるため、他のリダイレクトと比較してパフォーマンスは向上しませんが、便利な手順です。) - シェルリダイレクトを使用すると、複数のファイルをリンクしたり、プロセスリダイレクトを使用したりすることもできます。
sed [exp] < file1 file2
でもsed [exp] < <(grep command)
。このユースケースの詳細については、この問題を参照してください。プロセス置換とパイプ