1. shell 的派生
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令, 或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。
此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,脚本shell将终止,返回到执行该脚本之前的shell。
从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
2. shell中变量的生存周期
生命周期:在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它。
执行一个脚本时,会先开启一个子shell环境, 将父shell中的所有系统环境变量复制过来,这个脚本中的语句就在子shell中执行。父shell的环境变量在子shell中可以调用,但反过来就不行,如果在子shell中定义了环境变量,只对该shell或者它的子shell有效,当该子shell结束时,也可以理解为脚本执行完时,变量消失。
export: 要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时,定义这个变量的一个拷贝。这个过程称之为变量输出。
3. sh, source 与 export
(1) sh于source的区别:直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的。
(2) export的作用相当于将本来只作用于该shell的变量设置为系统变量。
脚本中如果只定义了变量未export, 则该变量仍只对该shell有效。 如果用source对脚本进行执行时,如果不加export,就不会在子shell中看到这个变量,因为它还不是一个系统环境变量,如脚本test.sh内容是:
test=‘value‘
直接source执行后,在shell下是能看到这个变量。(sh执行看不到哦~)
但再执行bash开一个子shell时,在test.sh中定义的变量是不会被复制到子shell中的,因为执行脚本文件其实也是在一个子shell中运行,所以我再建另一个脚本文件执行时,是不会输入任何东西的,内容如:echo $test。所以这点特别注意了,明明在提示符下可以用echo $test输出变量值,为什么把它放进脚本文件就不行了。
4. 示例:
1.sh的作用
脚本文件1:sh1.sh
执行:
# sh sh1.sh
# echo $v
# (无输出)
原因:因为执行脚本文件是在当前shell的一个子shell中进行的,所以执行完毕后,回到当前shell进行echo是看不到子shell中变量值的。
===================
脚本文件2:sh2.sh
执行:
# sh sh1.sh
# value
# bash
$ echo $v
$ (无输出)
原因:
当前shell进行 sh sh1.sh 后开了一个执行脚本文件的子shell,暂且称为shell1。sh sh1.sh可以输出值是因为那个echo是写在脚本文件中的,也就是该命令的执行是在执行脚本的shell中进行的,可以看到自己所在shell,也就是shell1的变量值。
再bash新开一个shell之后,是当前shell的子shell,暂且称为shell2。shell1, shell2都是当前shell的子shell,互相看不到对方变量信息。
注意:上面两个echo作用的shell是不同的!!! 脚本文件中的echo作用于 shell1;在命令行的echo作用于当前shell。shell1是当前shell的子shell.
====================
2. source的作用
还是用上面的脚本文件sh1.sh于sh2.sh
脚本文件1:sh1.sh
执行:
# source sh1.sh
# echo $v
# value
# bash
$ echo $v
$ value
===================
脚本文件1:sh2.sh
执行:
# source sh2.sh
# value
# echo $v
# value
# bash
$ echo $v
$ value
可以看到该变量作用在了当前环境,而非仅执行sh脚本文件的shell。
参考:https://www.cnblogs.com/zhangze/articles/1832542.html
原文地址:https://www.cnblogs.com/shiyublog/p/12371135.html