web-dev-qa-db-ja.com

「<&3」および「done <file11 3 <file22」の意味は何ですか

次のスクリプトがあります。

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

このコードは正常に動作しています。しかし、私はこれらを理解していません:

  • <&3
  • done < file11 3< file22
16
Gaurav

スクリプトは2つのファイルから文字列のペアを読み取ります。各反復で、文字列をfile11からlineAに、file22からlineBに読み取ります。これは、どちらかのファイルの終わりに到達するまで行われます。ループの本体は、2つの文字列と空白行を出力します。

<file11は、「標準入力をfile11からこのコマンドに接続/リダイレクトする」ことを意味します。「このコマンド」はwhileループです。これも0<file11と書かれている可能性があります。

標準入力はファイル記述子番号0です。ファイル記述子1および2は、標準出力および標準エラーストリーム用に予約されています。

3<file22は、「このコマンドのファイル記述子3をfile22に接続する」ことを意味します。番号3は次の「空き」ファイル記述子番号ですが、コードは4または5、または0、1、2以外の任意の小さな整数を使用できます(使用可能なファイル記述子番号の制限はシェルが何であるかによって異なります)使用されていますが、9までの数が機能することが保証されています)。

ループでは、read lineAはデフォルトで標準入力から文字列を読み取ります。つまり、ファイルfile11から文字列を読み取ります(標準入力はループから継承されます)。これもread lineA <&0と書かれている可能性があります。

read lineB <&3の場合、readコマンドは、標準入力からではなく、ファイル記述子3から、つまりfile22から読み取ります(ファイル記述子3は、標準入力と同じようにループで使用できます)。

つまり、標準入力ストリームと「追加の」ファイル記述子(番号3)を使用して、2つのファイルから(同時に各ファイルから一度に1つの文字列ずつ)2つのファイルを読み取ります。通常、one入力ストリームにのみアクセスできますが、これは2番目の入力ストリームを明示的に作成してfile22ファイルに接続することにより、その制限を回避します。

関連:


「行」ではなく、上の「文字列」という言葉を使用します。 2つのファイルから読み取られるものは、隣接する空白が取り除かれ、特定のエスケープシーケンスは特別に解釈されます。

readを使用してを読み取るには、

IFS= read -r varname

関連:

22
Kusalananda