bash:在循环中创建许多描述符

时间:2016-06-02 02:27:10

标签: linux bash exec file-descriptor flock

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

编辑:如果没有,也许有一种方法可以使用没有描述符的flock

1 个答案:

答案 0 :(得分:0)

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

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

,如果$i1,则相当于

exec 9>"abc/$i"

即使文件名更改为与abc/1不同的内容,这些复杂的引号也可确保eval-ed和exec-ed命令是安全的。

但是 there is警告:

  

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

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

  

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

所以,

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

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