bash exec set redirect use variable不起作用

时间:2013-12-04 06:47:36

标签: bash shell

我想打开十几个文件。所以我在bash中使用以下脚本:

for i in {20..30}
do
   touch $i
   exec $i>$i
done

但它不起作用,因为exec无法使用变量fd来设置重定向;

exec $i>$i # is incorrect, where $i is 20
exec 20>$i # is correct

BTW,以下脚本有效:

for i in {20..30}
do
   touch $i
   eval exec $i\>\$i
done

希望你能解释为什么?

2 个答案:

答案 0 :(得分:0)

根据eval manpage

  

语法             eval [arguments]

     

将参数连接成一个命令,   然后读取并执行,其退出状态返回为   退出状态的评估。如果没有参数或只是空的   参数,返回状态为零。

eval exec $i\>\$i将第一个$i替换为数字,第二个$i保留原样,因为在这种情况下您已转义$。如此有效地获得exec 2>$i,然后执行。

注意:使用bash -x执行并查看会发生什么。

答案 1 :(得分:0)

  

但为什么exec $ i> $ i不起作用?

Open Group Base规范第7版第2章.Shell命令语言,2.7 Redirection部分说:

  

重定向运算符前面可以有一个或多个数字(带有   不允许插入字符)指定文件   描述符编号。

     

如果重定向运算符是"<<"或"<< - ",后面的单词   重定向操作员应进行报价删除;它是   未指定是否发生任何其他扩展。对于另一个   重定向运算符,重定向运算符后面的单词   应进行波浪扩展,参数扩展,命令   替换,算术扩展和报价删除。

虽然没有明确说明,但仅为重定向运算符后面的单词提及参数扩展这一事实表明此扩展不适用于重定向运算符之前的内容。