我正在尝试在bash中为名为1,2,3等的文件创建多个描述符
例如,exec 9>abc/1
工作正常,但是当我尝试在for循环中创建描述符时,如:exec $[$i+8]>abc/$i
,它不起作用。我尝试了很多不同的方法,但似乎exec
只是不接受变量。有没有办法做我想做的事?
编辑:如果没有,也许有一种方法可以使用没有描述符的flock
?
答案 0 :(得分:0)
是的,exec
不接受文件描述符号的变量。正如评论中指出的那样,您可以使用
eval "exec $((i + 8))>"'"abc/$i"'
,如果$i
为1
,则相当于
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
)。