我试图为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/