いつ入力リダイレクトを使用する必要がありますか?

いつ入力リダイレクトを使用する必要がありますか?

同じ結果を生成する次の2つのコマンドを使用しています。

[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

これら2つの方法が互いに置き換え可能である場合の利点/欠点を説明してください。

ベストアンサー1

man grepページから(Debianの場合):

説明する

   grep  searches the named input FILEs (or standard input if no files are
   named, or if a single hyphen-minus (-) is given as file name) for lines
   containing  a  match to the given PATTERN.  By default, grep prints the
   matching lines.

最初のケースではgrepファイルが開き、2番目のケースではシェルがファイルを開き、それを標準入力に割り当て、grepファイルgrep名引数が渡されない場合は標準入力をgrepする必要があるとします。

1の利点:

  • grep複数のファイルをgrepできます1。
  • grepファイル名が表示されるたびに表示されることがありますline
  • grepfadvise(POSIX_FADV_SEQUENTIAL)開いているファイル記述子に対して操作を実行することは可能です2(しかし、実装についてはわかりません)。

2の利点:

  • ファイルを開くことができない場合、シェルはより関連性のある情報(スクリプトの行番号など)を含むエラーを返し、より一貫した方法でファイルを開きます(シェルが他のコマンドのためにファイルを開くことを許可した場合) )。 )grep。ファイルを開くことができない場合はgrep呼び出しさえできません(一部のコマンドでは - ではないかもしれませんが、 -grep大きな影響を与える可能性があります)。

  • grep line < in > out、開くことができない場合は作成または切り捨てられinませoutん。

  • -珍しい名前(またはで始まるファイル名など)を持つ一部のファイルには問題はありません-

  • 装飾:必要に応じて、<fileコマンドラインの任意の場所に配置して、コマンドフローをより自然に表示できます。<in grep line >out

  • 外観:GNUを使用すると、grepファイル名だけでなく、一致する行の前に使用するタグを次のように選択できます。

     <file grep --label='Found in file at line' -Hn line
    

パフォーマンスの観点からは、grepファイルを開くことができない場合は、リダイレクトを使用したときに実行を保存できますが、他にgrep大きな違いはないと予想されます。

リダイレクトを使用すると、追加のパラメータをに渡す必要がなくなり、パラメータの解析がやや簡単になりgrepますgrep。一方、シェルはファイルディスクリプタdup2()をファイルディスクリプタ0に転送するために、ファイルディスクリプタに対して(少なくとも)追加のシステムコールを実行する必要があります。

(ここではGNU)ファイルの残りの部分を見ることができるように、一致する行に戻ることを望みます{ grep -m1 line; next command; } < file(ファイルが検索可能かどうかを決定する必要があります)。つまり、stdinの位置は別の出力です。これにより、これを最適化することができ、心配することが1つ減ります。grepgrepseek()next commandgrepgrep -m1 line filegrep


ノート

これを使用して、zsh次のことができます。

grep line < file1 < file2

しかし、これはユーティリティをcat file1 file2 | grep line呼び出さないcatのと同じであるため、効率が悪くなり、最初のファイルが改行で終わらず、どのファイルにパターンが見つかったかを知らせないと混乱を招く可能性があります。

grep²これは、I / Oスケジューラがデータを読み取る方法など、より多くの情報に基づいて決定を下すためにファイルを順番に読み取るようにシステムに指示します。grepこれができます私自身fd、しかしfd 0でこれを行うのは間違っています。借りるfdのような呼び出し元から(またはむしろファイル説明を開く参照)は、後でまたは同時に非順次読み取りに使用できます。しかし、実際にはGNUがsortまだこれをやっていることがわかります。

ksh933および(およびの一部のシステム)では、リダイレクトターゲットで使用されているときに実際にファイルシステムでファイルを開くのではなく、特別な目的でシェルから傍受される類似のbashファイルがあります。これらのファイルはファイルシステムには存在しません。)識別された目的と同じですが、少なくともここでは名前空間がより適しています(誰でもすべてのディレクトリに名前付きファイルを作成できますが、管理者だけが名前付きファイルを作成できるため、管理者はよりよく知る必要があります)。/dev/tcp/host/port/dev/fd/xbash/dev/stdin-grep-/dev/tcp/host/port

おすすめ記事