So übergeben Sie einen Variablenwert als fd in der Shell

So übergeben Sie einen Variablenwert als fd in der Shell

Ich muss auf meiner Linux-Shell mehrere Dateien auf einmal öffnen und habe mir daher überlegt, den Sequenzwert wie folgt als FD-Wert zu übergeben:

in meinem Passwort habe ich Dateien mit den Namen nile.300, nile.301,....nile.500

Ich möchte also nile.300 mit fd 300 öffnen, nile.301 als fd 301 und so weiter

#!/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

Das Skript kann jedoch nicht mit ./fd.sh ausgeführt werden: Zeile 5: exec: 300: nicht gefunden

Antwort1

Sofern Sie nicht vorhaben, an allen geöffneten Dateien gleichzeitig zu arbeiten, ist es möglicherweise besser, jeweils eine Datei nach der anderen zu bearbeiten.

Durch diesen Ansatz ist es nicht mehr nötig, Hunderte von Dateien gleichzeitig zu öffnen, wodurch man möglicherweise das Limit für geöffnete Dateien erreicht.

for i in {300..500};do
    FILENAME=nile.$i

    exec 3<>$FILENAME

    # Write to file
    echo "Today is $(date)" >&3
    # Close
    exec 3>&-
done

Antwort2

Die korrekte Syntax ist, {variable}wenn es auf der linken Seite steht:

exec {i}<>"$FILENAME"

echo "Today is $(date)" >&$i

exec {i}>&-

verwandte Informationen