Мне нужно открыть несколько файлов одновременно в моей оболочке 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}>&-