Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash exec set redirect use变量不';行不通_Bash_Shell - Fatal编程技术网

bash exec set redirect use变量不';行不通

bash exec set redirect use变量不';行不通,bash,shell,Bash,Shell,我想打开十几个文件。因此,我在bash中使用以下脚本: for i in {20..30} do touch $i exec $i>$i done 但是它不起作用,因为exec不能使用变量asfd来设置重定向 exec $i>$i # is incorrect, where $i is 20 exec 20>$i # is correct 顺便说一句,以下脚本可以工作: for i in {20..30} do touch $i eval exec

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

for i in {20..30}
do
   touch $i
   exec $i>$i
done
但是它不起作用,因为
exec
不能使用变量as
fd
来设置重定向

exec $i>$i # is incorrect, where $i is 20
exec 20>$i # is correct
顺便说一句,以下脚本可以工作:

for i in {20..30}
do
   touch $i
   eval exec $i\>\$i
done
希望您能解释原因?

根据

语法 评估[论据]

这些参数被连接到一个命令中, 然后读取并执行,其退出状态返回为 eval的退出状态。如果没有参数或只有空参数 参数,返回状态为零

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

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

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

开放式集团基础规范第7期,第2章。Shell命令语言,第节说:

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


如果重定向运算符为“你到底想干什么?为什么不直接使用
cat
?这可能是我在StackOverflow问题中看到的第一次合法使用
eval
。+1我认为可以选择转义美元符号;无论参数
i
eval
exec
期间展开,都会得到相同的结果。