ファイルディスクリプタを直接開いて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番目のファイルディスクリプタが呼び出されたときにファイルオフセットはまだファイルの終わりを指し、cat
stdoutには何も記録されません。
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
。