cómo pasar un valor de variable como fd en shell

cómo pasar un valor de variable como fd en shell

Necesito abrir varios archivos a la vez en mi shell de Linux y, por lo tanto, pensé en pasar el valor de secuencia como valor fd como se muestra a continuación:

en mi pwd tengo archivos llamados nile.300, nile.301,....nile.500

Entonces quiero abrir nile.300 usando fd 300, nile.301 como fd 301 y así sucesivamente.

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

Sin embargo, el script no se ejecuta con ./fd.sh: línea 5: exec: 300: no encontrado

Respuesta1

A menos que planee trabajar en todos los archivos abiertos al mismo tiempo, sería mejor procesar un archivo a la vez.

Este enfoque elimina la necesidad de tener cientos de archivos abiertos al mismo tiempo, lo que podría llegar al límite de archivos abiertos.

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

    exec 3<>$FILENAME

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

Respuesta2

La sintaxis correcta es {variable}si está en el lado izquierdo:

exec {i}<>"$FILENAME"

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

exec {i}>&-

información relacionada