【问题标题】:bash: Creating many descriptors in a loopbash:在循环中创建许多描述符
【发布时间】:2016-10-01 14:07:59
【问题描述】:

我正在尝试为 bash 中名为 1、2、3 等的文件创建多个描述符。
例如,exec 9>abc/1 工作得很好,但是当我尝试在 for 循环中创建描述符时,像这样:exec $[$i+8]>abc/$i,它不起作用。我尝试了许多不同的方法,但似乎exec 只是不接受变量。有什么办法可以做我想做的事吗?

编辑:如果没有,也许有办法在没有描述符的情况下使用flock

【问题讨论】:

  • 另一方面,$[expression] 是不推荐使用的语法。请移步$((expression))
  • 试试eval "exec $((i+8))>abc/$i"

标签: linux bash exec file-descriptor flock


【解决方案1】:

是的,exec 不接受文件描述符编号的变量。正如在 cmets 中指出的那样,您可以使用

eval "exec $((i + 8))>"'"abc/$i"'

如果$i1,则相当于

exec 9>"abc/$i"

这些复杂的引号确保 eval-ed 然后 exec-ed 命令是安全的,即使文件名更改为不同于 abc/1 的名称。

但是there is一个警告:

使用大于 9 的文件描述符的重定向应谨慎使用,因为它们可能与 shell 内部使用的文件描述符冲突。

因此,如果您的任务不需要连续的文件描述符编号,您可以使用自动分配的描述符:

每个可能以文件描述符编号开头的重定向都可能以{varname} 形式的单词开头。在这种情况下,对于除>&-<&- 之外的每个重定向运算符,shell 都会分配一个大于10 的文件描述符并将其分配给varname

所以,

exec {fd}>"abc/$i"
echo "$fd"

将打开文件描述符 10(或更大)以写入 abc/1 并打印该文件描述符编号(例如 10)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2014-04-25
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多