- 论坛徽章:
- 0
|
本帖最后由 Looiml 于 2014-11-20 20:08 编辑
回复 16# aingwen
“大神”这称号实在是不敢当啊,今天心情不错,让在下来解释一下^V^
Follow these steps:
1. 在这条命令中,管道符的优先级最高,所以该命令被拆成通过管道连接的两条命令:
eval echo {`echo a,b,c`}{1..8}
tr " " "," #因这条命令简单得离谱,后面不作解释
2. 现在来解析第一条命令:
eval echo {`echo a,b,c`}{1..8}
eval后的所有内容均识别为它的参数,所以首先要完成这些参数的解析,大括号扩展({1..8})的优先级要高于命令扩展(`echo a,b,c`),所以命令解析为:
eval echo {`echo a,b,c`}1 {`echo a,b,c`}2 {`echo a,b,c`}3 {`echo a,b,c`}4 {`echo a,b,c`}5 {`echo a,b,c`}6 {`echo a,b,c`}7 {`echo a,b,c`}8
3. 解释器发现参数里还有命令扩展,遂扩展之:
eval echo {a,b,c}1 {a,b,c}2 {a,b,c}3 {a,b,c}4 {a,b,c}5 {a,b,c}6 {a,b,c}7 {a,b,c}8
4. eval的参数解析完成,于是开始在子shell里执行参数:
echo {a,b,c}1 {a,b,c}2 {a,b,c}3 {a,b,c}4 {a,b,c}5 {a,b,c}6 {a,b,c}7 {a,b,c}8
解释器解析echo命令的参数,识别到大括号扩展,于是解析成:
echo a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 a5 b5 c5 a6 b6 c6 a7 b7 c7 a8 b8 c8
5. 后面的大家都知道了。
知道为什么echo {a..b}{1..8}为什么会得到那样的结果吗,因为{a..b}和{1..8}的优先级一样,会从左至右依次扩展,上面的句法可以用来修改连续大括号扩展的内外for循环优先顺序。
|
|