ファイル記述子が一度だけ開いて読み取られるのはなぜですか?

ファイル記述子が一度だけ開いて読み取られるのはなぜですか?

ファイルディスクリプタを直接開いてstdinにリダイレクトするとき、なぜ一度だけ使用できますか?私が言いたいことを理解するには、次の例を見てください。 catコマンドで一度読み込んだ後は、同じファイル記述子を介して2番目にファイルを読み取ることはありません。

└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$

ベストアンサー1

ファイルを印刷するには、まずcatファイルを最後まで読んでください。 exec 6< input.txtシェルがファイルディスクリプタを終了または閉じるまでファイルディスクリプタを保持するので、2番目のファイルディスクリプタが呼び出されたときにファイルオフセットはまだファイルの終わりを指し、catstdoutには何も記録されません。

Linuxベースのシステムを使用している場合は、ファイル記述子情報を見ると何が起こっているのかを確認できます。

echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6

スクリプトを実行すると、次の結果が表示されます。

pos:    0
flags:  0100000
mnt_id: 113
File contents
pos:    14
flags:  0100000
mnt_id: 113

2回目の実行では、オフセット(pos)がゼロ以外の端を指していることを確認してください。cat

オフセットをリセットするには、sexec 6< input.txt間に別のオフセットを追加するだけですcat

おすすめ記事