Linux シェルで一度に複数のファイルを開く必要があるため、以下のようにシーケンス値を fd 値として渡すことを考えました。
私の pwd には nile.300、nile.301、....nile.500 という名前のファイルがあります
そこで、fd 300を使用してnile.300を開き、fd 301としてnile.301を開きたいのです。
#!/bin/bash
for i in {300..500};do FILENAME=nile.$i
# Opening file descriptors # 3 for reading and writing
# i.e. /tmp/out.txt
exec $i<>$FILENAME
# Write to file
echo "Today is $(date)" >&$i
done
sleep 10;
for i in {300..500};do
# close fd # 3
exec $i>&-
done
しかし、スクリプトは ./fd.sh: 行 5: exec: 300: 見つかりません で実行に失敗します。
答え1
開いているすべてのファイルを同時に処理する予定がない限り、一度に 1 つのファイルを処理する方が適切です。
このアプローチにより、同時に何百ものファイルを開く必要がなくなり、開いているファイルの制限に達する可能性がなくなります。
for i in {300..500};do
FILENAME=nile.$i
exec 3<>$FILENAME
# Write to file
echo "Today is $(date)" >&3
# Close
exec 3>&-
done
答え2
正しい構文は、{variable}
左側にある場合です。
exec {i}<>"$FILENAME"
echo "Today is $(date)" >&$i
exec {i}>&-