como passar um valor de variável como fd no shell

como passar um valor de variável como fd no shell

Preciso abrir vários arquivos de uma só vez no meu shell do Linux e, portanto, pensei em passar o valor da sequência como o valor fd conforme abaixo:

no meu pwd tenho arquivos nomeados como nile.300, nile.301,....nile.500

Então eu quero abrir o nile.300 usando fd 300, nile.301 como fd 301 e assim por diante

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

No entanto, o script não é executado com ./fd.sh: linha 5: exec: 300: não encontrado

Responder1

A menos que você esteja planejando trabalhar em todos os arquivos abertos ao mesmo tempo, talvez seja melhor processar um arquivo de cada vez.

Essa abordagem elimina a necessidade de ter centenas de arquivos abertos ao mesmo tempo, potencialmente atingindo o limite de arquivos abertos.

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

    exec 3<>$FILENAME

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

Responder2

A sintaxe correta é {variable}se estiver no lado esquerdo:

exec {i}<>"$FILENAME"

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

exec {i}>&-

informação relacionada