次のスクリプトがあります。
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
このコードは正常に動作しています。しかし、私はこれらを理解していません:
<&3
done < file11 3< file22
スクリプトは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
関連: