как передать значение переменной в качестве fd в оболочке

как передать значение переменной в качестве fd в оболочке

Мне нужно открыть несколько файлов одновременно в моей оболочке Linux, поэтому я подумал о передаче значения последовательности в качестве значения fd, как показано ниже:

в моем pwd есть файлы с именами nile.300, nile.301,....nile.500

Итак, я хочу открыть nile.300, используя fd 300, nile.301 как fd 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: not found

решение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}>&-

Связанный контент