命令在Shell中的执行
时间:2010-04-24 来源:xfwduke
http://bbs.chinaunix.net/thread-512925-2-1.html的讨论的中提到了shell执行命令的过程,即所有可以解析的变量会在当前shell中做替换,完成变量替换后,再创建sub shell并执行相应的命令.
#! /bin/bash
#1.bash echo $A |
$ A="aaa"
$ echo $A
aaa
$ ./1.bash <nth> |
在当前shell查看变量A的值,很正常的输出.
在当前shell调用脚本 1.bash,会新建一个sub shell再执行其中的命令,由于sub shell中并没有定义变量A,所以没有任何输出.
$ A="aaa"
$ source 1.bash aaa |
以source方式让 1.bash在当前shell中执行,能得到A的值
$ A="aaa"
$ A="bbb" ./1.bash #
bbb
$ echo $A aaa
$ A="bbb"; ./1.bash ## <nth> $ echo $A
bbb |
"#"行实际的效果是在 1.bash中插入了 A="bbb",再输出其值,由于脚本中的变量属于sub shell,所以并不会影响到当前shell中的同名变量.
"##"行加了个分号 ";",将赋值和执行拆开为2条命令,这样是对A的赋值在当前shell执行,然后再新建sub shell执行 1.bash,所以会有下面的结果.
$ A="aaa"
$ A="bbb" echo $A #
aaa
$ echo $A bbb |
在 "#" 行,shell会将echo $A中的变量$A首先替换为"aaa",然后再执行echo,所以可以等效为
$ A="bbb" echo "aaa" |
所以才会有下面的输出结果.即,遵循 "先替换,再执行"的原则.