我试图在bash中为名为1、2、3等的文件创建多个描述符。
例如,exec 9>abc/1工作得很好,但是当我试图在For循环中创建描述符时,比如:exec $[$i+8]>abc/$i,它就不能工作了。我尝试了许多不同的方法,但似乎exec只是不接受变量。有办法做我想做的事吗?
编辑:如果没有,也许有一种没有描述符的使用flock的方法吗?
发布于 2016-08-03 23:08:04
是的,exec不接受文件描述符号的变量。正如注释中指出的,您可以使用
eval "exec $((i + 8))>"'"abc/$i"'如果$i是1,则相当于
exec 9>"abc/$i"即使文件名被更改为与abc/1不同的文件名,这些复杂的引号也确保了eval ed命令和exec-ed命令是安全的。
但 的确有警告:
使用大于9的文件描述符的重定向应该谨慎使用,因为它们可能与shell内部使用的文件描述符发生冲突。
因此,如果任务不需要连续的文件描述符号,则可以使用自动分配的描述符:
可以在每个重定向前面加上一个文件描述符号,取而代之的是表单
{varname}的一个字。在这种情况下,除了>&-和<&-之外,对于每个重定向操作符,shell将分配一个大于10的文件描述符,并将其分配给varname。
所以,
exec {fd}>"abc/$i"
echo "$fd"将打开用于写入abc/1的文件描述符10 (或更高),并打印该文件描述符号(例如10)。
https://stackoverflow.com/questions/37581661
复制相似问题