「<&3」と「完了< file11 3< file22」とはどういう意味ですか?

「<&3」と「完了< file11 3< file22」とはどういう意味ですか?

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

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

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

  • <&3
  • done < file11 3< file22

ベストアンサー1

このスクリプトは両方のファイルから文字列のペアを読み込みます。繰り返しごとに、file11intolineAと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

関連:

おすすめ記事