Linux shell脚本中父子进程与变量的分析

来源:互联网 发布:js控制按钮 编辑:程序博客网 时间:2024/05/29 10:06

转载地址:https://site.douban.com/196781/widget/notes/12220452/note/261008964/

【问题】一个 test.sh 里面这么写
#! /bin/bash
read test
echo $test
exit 0
保存, chmod +x test.sh
./test.sh
譬如输入 ok, 脚本就输出 ok
然后在 shell 下
直接 echo $test 却没有输出 ok...
这是怎么回事?这个自定义的变量不能同时使用么?
【分析】
问题的现象是在外部shell中echo $test输出了一个空值,考虑到给test赋值是在脚本程序中进行的,因此脚本做如下改动进行测试

 

第7行代码打印出当前进程ID。第8行代码打印出当前进程ID及父进程ID。
 

【现象描述】:
1.echo $$显示当前登录shell进程ID为2663;
2.执行脚本文件,分隔符第一行显示登录shell派生出一个进程ID为2783的shell执行进程;该进程负责扫描shell脚本进行执行;
3.进程2783脚本执行进程负责逐行执行脚本,遇到可执行程序就派生新的子进程来执行,进程号为2784和2785的进程都是执行shell 2783 进程派生的子进程ps和grep .
【结果解释】
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。shell执行外部命令或运行shell脚本程序时,系统将创建一个子shell,然后在子Shell中执行此Shell脚本 。一旦子Shell中的脚本执行完毕,此子Shell随即结束,返回到父Shell中,但不会影响父Shell原本的环境。这就是解释了为什么在登录shell中echo显示空值;
【解决办法】
解决问题的思路有两个。第一,在当前shell执行脚本;第二,将子shell变量传递给父shell。
现在考虑第第一个思路:如果要想在当前shell中执行脚本,而不派生子shell,经查阅可以使用. ./test.sh 或者 source ./test.sh命令来执行。(注意第一个点之间的空格)
 

结果显示使用. ./test.sh命令可以直接在当前shell中执行了脚本程序。这时可以直接在的登录shell中显示变量。
最后测试结果,验证了假设。
 

PS:关于export
1.一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);
2.一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
3.不用export定义的变量只对该shell有效,对子shell也是无效的。

0 0
原创粉丝点击