我试图为bash中名为1、2、3等的文件创建多个描述符。
例如,exec 9>abc/1工作得很好,但是当我尝试在For循环中创建描述符时,比如:exec $[$i+8]>abc/$i,它就不工作了。我尝试了许多不同的方法,但似乎exec只是不接受变量。有什么办法做我想做的吗?
编辑:如果没有,也许有一种方法可以使用不带描述符的flock

最佳答案

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

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

如果$i等于1,则等于
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)。

关于linux - bash:在循环中创建许多描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37581661/

10-15 15:40