非標準のファイル記述子を使用してマップされたファイルを介してファイルを配列に読み込む方法は?

非標準のファイル記述子を使用してマップされたファイルを介してファイルを配列に読み込む方法は?

mapfile -t -u 7 arr < textfilebash: mapfile: 7: invalid file descriptor: Bad file descriptor そのような記述子を許可するファイルを1行ずつ読み取るためのより詳細な方法を教えてください。

read_w_while() {
while IFS="" read -u 7 -r l || [[ -n "${l}" ]]; do
  echo "${l}"
done 7< textfile

標準記述子は0広く使用されています。そのような記述子を使用すると、スクリプトは干渉からより安全になりますか?私の経験によると、私はwhile IFS="" read -u 7 ...これまでこの干渉を目撃しており、記述子を使用するときにUbuntuデスクトップユーザーです7。この干渉の原因は何ですか?

答え1

mapfile -t -u 7 arr < textfile私にしてください。
bash: mapfile: 7: invalid file descriptor: Bad file descriptor

はい、fd 7が開いていない場合は可能です。-u 7 ただfd 7で読むように指示されていますが、そのfdがどのようにするのか、どこにあるのかはわかりません。

2番目のコードスニペットにはfd 7でファイルを開く入力リダイレクトがあるため、7< textfilefd 7でファイルを読むのは自然でなければなりません。

read生の標準入力を同時に使用する必要がある場合は、通常、他のファイル記述子が使用されます。たとえば、while read ...ループを使用してファイルからデータを読み込みますが、端末(標準入力)から読み取った内容をループ内で実行する場合があります。

厳密に言えば、この-u fdオプションはegを使って同等の機能を得ることができるので必要ありませんread ... 0<&7。ただし、ファイル記述子を正しい場所に配置するには、シェルが少しジャグリングを実行する必要があるという欠点があります。

  • まず、安全な保管のためにfd 0を別の番号(例:fd 9)にコピーします。
  • fd 7をfd 0にコピーする(前のfd 0を閉じる)
  • 実行read, fd 0で読む
  • fd 9から元のfd 0をコピーする(現在のfd 0を閉じる)
  • fd 9 で、不要なコピーを閉じます。

これだけではなく

  • 実行read -u 7, fd 7で読む

(もともと明示的なステップとして「close fd 0」を書きましたが、それはdup2()ターゲットfdを自動的に閉じます。)

答え2

-u 7コメントで指摘したように、< textfile一致するものはありません。機能するには、リダイレクトを省略する-u 7か、2番目の例のリダイレクトに変更する必要があります。7< textfileファイル記述子7がまだ開かれていないため、エラーが発生します。

セキュリティの問題については、ファイル記述子7を使用すると、どのようにしてセキュリティがどのように変更されるのかわかりません。このような他のファイル記述子を使用する唯一の理由は、そのパイプラインの他の目的のために既存の標準入力を保存したい場合です。これは単一のコマンド(マップファイル)であり、複雑なパイプラインではないため意味がありません。

関連情報