我正在尝试为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
的名称。
但是有一个警告:
使用大于9的文件描述符的重定向应该小心使用,因为它们可能与shell内部使用的文件描述符冲突。
因此,如果您的任务不需要连续的文件描述符编号,您可以使用自动分配的描述符:
每个前面可能有一个文件描述符编号的重定向前面都可以有一个形式为
{varname}
的单词。在这种情况下,对于除>&-
和<&-
之外的每个重定向操作符,shell将分配一个大于10的文件描述符,并将其分配给varname
。
因此,
exec {fd}>"abc/$i"
echo "$fd"
将打开用于写入abc/1
的文件描述符10(或更大),并打印该文件描述符编号(例如10
)。