2025年shell脚本export变量只限脚本内么_shell脚本调用oracle存储过程

shell脚本export变量只限脚本内么_shell脚本调用oracle存储过程shell 脚本中 export 命令未生效 原因详解 问题 我有一个脚本 脚本中有如下一条语句 export fdu dufan 用 sh 运行脚本后 在当前 shell 利用命令 env 查看环境变量 但是却没有 fdu 变量 难道是因为我的 export 语句没有生效 解决结果 脚本中的 export 一定是生效的 利用 source 执行脚本 在当前 shell 即可查看到 fdu 环境变量

shell脚本中export命令未生效,原因详解

问题:我有一个脚本,脚本中有如下一条语句

export fdu=“dufan”

用sh运行脚本后,在当前shell利用命令env查看环境变量,但是却没有fdu变量,难道是因为我的export语句没有生效?

解决结果:

脚本中的export一定是生效的

利用source执行脚本,在当前shell即可查看到fdu环境变量。

----

----

这个问题涉及了三个知识点:

变量(环境变量、自定义变量)

父进程与子进程

脚本的执行方式

什么是变量?变量的分类?

1. 环境变量
全局变量,可被子进程继承
2. 自定义变量
局部变量,不可被子进程继承

环境变量与自定变量的区别?

环境变量与自定义变量的区别:该变量是否会被子进程所继续引用
拓展

什么是父进程?什么是子进程?

子进程仅继承父进程的环境变量,子进程不会继承父进程的自定义变量
可使用如下命令将自定义变量转换为环境变量:
export 变量名称

为什么父进程的环境变量数据可被子进程引用?

启动一个shell,os会分配一个记忆块给shell使用,此内存内的变量可让子进程取用

若父进程利用export功能,可以让自定义变量的内容写到上述的记忆块中

当加载另一个shell(子进程),子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量块中

变量显示命令

显示环境变量

env

export

显示环境变量+自定义变量

set

source、sh、./ 命令执行的区别

​ 用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的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进程进行脚本执行,脚本执行结束后,环境变量生效。

----

----

实践验证

export功能验证

[root@vm fdu]# set | grep fdu_val
fdu_val=haha
[root@vm fdu]# env | grep fdu_val
[root@vm fdu]#
[root@vm fdu]# export fdu_val
[root@vm fdu]#
[root@vm fdu]# env | grep fdu_val
fdu_val=haha
[root@vm fdu]# set | grep fdu_val
fdu_val=haha
[root@vm fdu]#

可以看到export命令将fdu_val自定义变量转换为了环境变量

脚本执行方式对export的影响验证

fdu_test.sh脚本如下:

#####################################################
###export命令测试
#环境变量
export fdu_env_val="env_val"

source执行脚本

[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同样生效

sh执行脚本

[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),环境变量设置未生效

编程小号
上一篇 2025-01-27 20:57
下一篇 2025-02-13 13:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/122670.html