shell中的eval
eval语法
eval arg1 arg2 ...
eval的作用就是将后面的参数arg1 arg2等等当成一个pipeline,然后重新执行shell处理pipeline的流程(有关pipeline,参看http://www.cnblogs.com/chaoguo1234/p/5724321.html)
假设有如下脚本语句:
var="ls | more" $var
上面的程序本意是列举当前目录的文件,然后使用more展示结果,但是实际执行情况会报错:
ls:can't access |:No Such file or directory
ls:can't access more:No Such file or directory
原因就是将$var进行命令替换之后,shell就进行命令查找,此时查找到命令是ls,后面的|和more都当成ls的参数,而当前目录中没有名为|和more的文件和目录,所以回报错。看一下shell处理命令的流程就清除了:
从上图可以看到,当执行完$var的变量扩展后,shell就要进行command查找。
解决的方式就是使用eval命令:
var="ls | more" eval $var
进行完$var的变量替换之后,实际成为eval ls | more,然后根据eval的语法,shell会将ls | more当成一个pipeline,重新从上图中的第一步开始执行。