シェルで変数値を fd として渡す方法

シェルで変数値を fd として渡す方法

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}>&-

関連情報