Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45114
  • 博文数量: 43
  • 博客积分: 1161
  • 博客等级: 少尉
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:14
文章分类
文章存档

2011年(40)

2010年(3)

分类: Python/Ruby

2010-04-24 19:55:39

在shell中以just the name方式执行自定义的脚本时,会先创建一个sub shell,脚本实际是在sub shell中执行的.
的讨论的中提到了shell执行命令的过程,即所有可以解析的变量会在当前shell中做替换,完成变量替换后,再创建sub shell并执行相应的命令.

#! /bin/bash

#1.bash

echo $A


$ A="aaa"

$ echo $A

aaa

$ ./1.bash


在当前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 ##

$ 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"


所以才会有下面的输出结果.即,遵循 "先替换,再执行"的原则.
阅读(695) | 评论(0) | 转发(0) |
0

上一篇:脚本的两种执行方式

下一篇:Bash Keywords

给主人留下些什么吧!~~