4行のファイルがあります。
$ cat file
First line
Second line
Third line
Fourth line
$
このファイルを4回読み取ると、常に最初の行が読み取られました。これは予想される結果です。
$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$
ただし、ファイルディスクリプタ3に接続してfile
同じ方法で読み取ると、各読み取りは入力ストリームを「食べます」。
$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$
ファイル記述子はなぜこのように動作しますか?
ベストアンサー1
次のようにすると、read var <file
コマンドが完了した後にファイル記述子が閉じます。したがって、次にループを通過すると、ファイル記述子は最初にリセットされます。
この場合、exec 3<file
読み取りread -r -u 3 var
コマンドが完了して読み取り位置が更新されても、ファイル記述子は開いたままであるため、次に読み取りは次の行を取得します。
注:これを実行しても、同じように機能しますexec 0<file
。read -r var