我想打开十几个文件。所以我在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
希望你能解释为什么?
答案 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部分说:
重定向运算符前面可以有一个或多个数字(带有 不允许插入字符)指定文件 描述符编号。
如果重定向运算符是"<<"或"<< - ",后面的单词 重定向操作员应进行报价删除;它是 未指定是否发生任何其他扩展。对于另一个 重定向运算符,重定向运算符后面的单词 应进行波浪扩展,参数扩展,命令 替换,算术扩展和报价删除。
虽然没有明确说明,但仅为重定向运算符后面的单词提及参数扩展这一事实表明此扩展不适用于重定向运算符之前的内容。