IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell脚本中export命令未生效,原因详解 -> 正文阅读

[系统运维]shell脚本中export命令未生效,原因详解

1.问题发现

? 安装?jemalloc 后,执行?/usr/bin/jemalloc.sh 脚本生效环境变量?LD_PRELOAD。执行过后发现环境变量并未生效。过程如下:

[root@10-27-30-48 shao]# more jemalloc.sh 
#!/bin/sh

prefix=/usr
exec_prefix=/usr
libdir=/usr/lib64

LD_PRELOAD=${libdir}/libjemalloc.so.1
export LD_PRELOAD
exec "$@"
[root@10-27-30-48 shao]# sh jemalloc.sh 
[root@10-27-30-48 shao]# env|grep LD_PRELOAD

NOTE:当时意识到可能是脚本执行姿势不对,因为通常使用 source /root/.bash_profile 命令来生效用户环境变量。换成 source 执行后,环境变量确实生效了,如下:

[root@10-27-30-48 shao]# source jemalloc.sh 
[root@10-27-30-48 shao]# env|grep LD_PRELOAD
LD_PRELOAD=/usr/lib64/libjemalloc.so.1

#NOTE:只是在当前shell中该环境变量生效

2.解决方案

? 着急的朋友可以直接看解决方案如果想shell 脚本中的 export 生效,需要通过 source 命令执行脚本,如:

source jemalloc.sh

3.问题原因分析

? 讲解这个问题前,我们需要先知道如下三个知识点:

3.1 变量(环境变量,自定义变量)

? 1)环境变量和自定义变量区别

变量分为环境变量和自定义变量。环境变量是全局的,可以被子进程继承。自定义变量是局部变量,不可被子进程继承。

? 2)子进程可以继承父进程环境变量

启动一个shell,os会分配一个记忆块给shell使用,此内存内的变量可以让子进程取用。若父进程使用export 命令定义了一个环境变量,该环境变量会写入到上述的内存中。当该父进程启动一个子进程时,子进程会把父进程该内存块中记录的环境变量导入到自己的记忆块中。

?3)变量显示命令

显示环境变量的命令:

env 或者 export

显示环境变量+自定义变量+shell函数

set

3.2 父进程和子进程

??

3.3 脚本执行方式区别

source , sh, ./? 不同方式执行脚本的区别:

source某脚本时,是在当前shell中执行,并未创建子进程(子shell)。

sh某脚本或./某脚本时,会创建子shell,在子进程中进行脚本的执行。

./要求该用户对执行的脚本有执行权限,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时定义这个变量的一个拷贝。
这个过程称之为变量输出。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:56:36  更:2022-10-22 21:58:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:46:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码