exportfdu=“dufan”
用sh运行脚本后,在当前shell借助命令env查看环境变量,然而却没有fdu变量,莫非是由于我的export句子没有生效?
解决结果:
脚本中的export一定是生效的借助source执行脚本,在当前shell即可查看到fdu环境变量。
这个问题涉及了三个知识点:
哪些是变量?变量的分类?
1.环境变量
全局变量,可被单进程承继
2.自定义变量
局部变量,不可被单进程承继
环境变量与自定变量的区别?变量显示命令source、sh、./命令执行的区别
用户登入到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或申明变量LINUX虚机,也可以创建并运行shell脚本程序。运行shell脚本程序时linux 环境变量不生效,系统将创建一个子shell。此时,系统上将有两个shelllinux 环境变量不生效,一个是登陆时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将中止,可以返回到执行该脚本之前的shell。从这些意义上来说,用户可以有许多shell,每位shell都是由某个shell(称为父shell)派生的。
在子shell中定义的变量只在该子shell内有效。假如在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell(子shell)中被使用,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
source某脚本时,是在当前shell中执行,并未创建子进程(子shell)。
sh某脚本或./某脚本时,会创建子shell,在子进程中进行脚本的执行。
./要求该用户对执行的脚本有执行权限,sh无要求。
晓得上述几个知识点后,可以用一段话解释缘由:
export命令可以使自定义变量转换为环境变量,环境变量(全局变量)可被单进程承继,自定义变量(局部变量)不可以被单进程承继。sh执行脚本时,linux将创建子shell进程进行脚本执行,脚本执行结束后,在当前shell(父进程)必然难以查看早已消失的子进程的环境变量。而soure执行脚本,linux将在当前shell进程进行脚本执行,脚本执行结束后linux运维招聘,环境变量生效。
实践验证
[root@vm fdu]# env | grep fdu_env_val
fdu_env_val=env_val
[root@vm fdu]# set | grep fdu_env_val
fdu_env_val=env_val
[root@vm fdu]# /bin/bash
[root@vm fdu]# env | grep fdu_env_val
fdu_env_val=env_val
[root@vm fdu]# set | grep fdu_env_val
fdu_env_val=env_val
[root@vm fdu]#```
可以看见:source执行脚本,当前shell生效,子shell同样生效
[root@vm fdu]# env | grep fdu_env_val
[root@vm fdu]# set | grep fdu_env_val
[root@vm fdu]#
[root@vm fdu]# /bin/bash
[root@vm fdu]# export fdu_env_val="heihei"
[root@vm fdu]# env | grep fdu_env_val
fdu_env_val=heihei
[root@vm fdu]# set | grep fdu_env_val
fdu_env_val=heihei
[root@vm fdu]# exit
exit
[root@vm fdu]# set | grep fdu_env_val
[root@vm fdu]# env | grep fdu_env_val
[root@vm fdu]#
可以看见:sh执行脚本,当前shell无效,/bin/bash步入子shell模拟sh执行脚本,发觉子shell生效,退出子shell,回到父shell(当前shell),环境变量设置未生效