次のスクリプトがあります。
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
このコードはうまく動作します。しかし、私はこれを理解していません:
<&3
done < file11 3< file22
答え1
このスクリプトは両方のファイルから文字列のペアを読み込みます。繰り返しごとに、file11
intolineA
とintoからfile22
文字列を読み込みますlineB
。 2つのファイルのいずれかが終了するまでこれを行います。ループ本体は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回)を使用して、「同時に」(各ファイルから一度に1つの文字列)2つのファイルを読み取ります。通常、1人だけがアクセスできます。一つただし、これは明示的に2番目の入力ストリームを作成し、それをファイルにリンクすることによってこれらの制限を回避しますfile22
。
関連:
上記では、「line」の代わりに「string」という単語を使用しました。両方のファイルを読み取ると、両側にスペースが削除され、特定のエスケープシーケンスが特別に解釈されます。
読むワイヤー使うread
、使う
IFS= read -r varname
関連: