shell的命令替换与eval

学习 shell 中遇到了 shell 提供的 这个 功能:命令替换,在shell学习指南 7.8章节的执行顺序中有详细讲解。


在执行一条命令时,会先将其中的 `` ,$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行,例如:


echo `ls`

 

会先执行 ls 得到 xx.sh ,xx.js 等,再替换原命令为:


echo xx.sh xx.js
 

最后执行结果为


xx.sh xx.js
 

但是 shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。


1.shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过 `` ,$()取得。


2.shell 中的 eval

 

    2.1 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 ``来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。

 

    2.2 eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代,即

 

x=`\`code\``
 

或单独

 

`code`
 

来 执行(执行动态生成的code的返回)。


故总的来说在shell中,函数与命令没有明显区别,将字符串做为命令执行这一功能被分裂为 ``,eval 两种形式,单独使用 ``,如

`'ls'` 

,会出现ls执行后的值替换原命令再次执行,而出错

 

eval 'ls'

 则从另一角度执行了做为字符串的命令ls,但是由于没有命令替换的过程,执行不会出错

 

但是如果要取得命令的输出,则只能使用``。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值