- 论坛徽章:
- 0
|
这个要从shell的执行流程说起。举例如下
$ vim test.sh
1 #!/bin/sh -x
2 cmd='find ./ -name "*.js"'
3 $cmd | grep "123"
$ ./test.sh
+ cmd='find ./ -name "*.js"'
+ grep 123
+ find ./ -name '"*.js"'
shell执行步骤 $cmd | grep "123"
1. 单词分割(认识元字符) 命令被分割成
$cmd 和 grep "123"
先执行grep "123" 等待屏幕输出
2. 变量扩展 $cmd 变成 find ./ -name "*.js"
3. 单词分割(进分割扩展部分,且不认识元字符)后
find ./ -name ’"*.js"‘
shell单词分割会自动加上''(命令和-arg 等除外)
4. 路径扩展:这步会扩展统配符。包含 *、?和[。对我的命令无影响
如果cmd='find ./ -name *.js' ,那么这步就会在当前目录下找所有js文件,若当前目录有1.js 2.js
则这步过被扩展为 find ./ -name ’1.js’ ’2.js' 很显然无法执行
5. 引号移除 find ./ -name "*.js" (移除所有的非扩展结果的引用字符,这里是单引号'')
6. 执行指令 find ./ -name "*.js" (注意这里匹配所有"*.js" 包括双引号)
注意: eval $cmd | grep "123" 等同 find ./ -name "*.js" | grep "123"
eval会使命令扩展两次。第二次会从流程头部开始一次。 |
|