zdl_361 于 2010-08-21 15:23:29发表:
[i=s] 本帖最后由 zdl_361 于 2010-8-22 23:17 编辑 [/i]
由于bash shell按照以下顺序分析命令行字符串:
1 $()输出展开
2 变量替换
3 然后参数分割
最后执行命令,传递参数所以
如果变量
CM='ls -a'
然后你在命令行内执行
$CM
shell分4步解释
第0 没有$()命令,无操作.
第一 变量展开成字符串"ls -a -l"
第二 按照空白分割成三个部分 ls 和 -a 和-l
第三 以第一个部分为命令名开始调用命令(也就是ls), 并且把-a作为命令的第一个参数传入 -l作为命令第二个参数传入
shell调用命令的过程其实就是在PATH里面搜索程序名称。第一个找到就执行,其他目录就忽略。
当然新的bash内部有hash功能,将程序的绝对地址记录在一张表里面。
以上方式在zsh中会失败。因为zsh按照以下顺序执行
1 $()输出展开
2 然后参数分割
3 变量替换
最后执行命令,传递参数所以
可以做如下实验。
bash:
$ CM='echo hello'
$ $CM
hello
zsh:
$ CM='echo hello'
$ $CM
zsh: command not found: 'echo hello'
$ #也就是说zsh在PATH目录里面搜索名为'echo hello'的命令,但其实你是想让它搜索echo.,参数分析过程和通常见到的不一样。
-----------
使用eval结果始终是正确的.
这使得脚本比较通用。