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


16

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

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

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

  • <&3
  • done < file11 3< file22

1
スクリプトの内容を教えてください。(あなたはそれがうまく機能していると言います)
マシュー

回答:


22

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

<file11は、「file11このコマンドに標準入力を接続/リダイレクトする」という意味whileです。「このコマンド」はループです。これも書かれたかもしれません0<file11

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

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

ループでread lineAは、デフォルトで標準入力、つまりファイルから文字列を読み取りますfile11(標準入力はループから継承されます)。これも書かれたかもしれませんread lineA <&0

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

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

関連:


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

読むにはラインを使用してread、使用することを

IFS= read -r varname

関連:


いい答えです!私が理解していないのは、ファイル記述子3の使用方法です。これは、3<file22が返さfopenれるのでFIDはなく、事前に指定されている場所のようなものですか?
A.ドンダ

2
@ A.Dondaについて説明していfdopen()ます。はい。
クサラナナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.