如何在 shell 中将变量值作为 fd 传递

如何在 shell 中将变量值作为 fd 传递

我需要在我的 Linux Shell 上一次打开多个文件,因此考虑将序列值作为 fd 值传递,如下所示:

在我的密码中,我有名为 nile.300、nile.301、....nile.500 的文件

因此我想使用 fd 300 打开 nile.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:未找到

答案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}>&-

相关内容