Linux命令之--export设置显⽰系统环境变量
⽂章⽬录
⼀、命令介绍
export 的基本作⽤就是将⽗ shell 中的局部变量设置为环境变量,使得该变量可以在⼦ shell 中使⽤。系统变量path修改了怎么恢复
export 命令⽤于将 shell 变量输出为环境变量,或者将 shell 函数输出为环境变量。
⼀个变量创建时,在它之后创建的 shell 进程是不知道的,⽽命令 export 则可以向后⾯的 shell 进程传递变量的值;同样的,被调⽤执⾏的 shell 脚本是⽆权访问调⽤者定义的变量的,除⾮这些变量已经被显式地设置为可⽤,但是命令 export 可以传递变量的值给后继脚本。
⼆、export 的原理
(⼀)什么是进程
进程是⼀个运⾏着的程序,是代码的动态形式,进程有如下属性:
独⽴的内核堆栈
进程控制块
独⽴的存储空间
由于每个进程有⾃⼰独⽴的存储空间,所以进程间的的数据是不可见的,进程间的交互需要⽤到进程间通信。所以在⼀个进程内的操作通常不会影响到另⼀个进程的内容,也不会被另⼀个进程所看到。每⼀个 shell 都是⼀个独⽴的进程。
(⼆)⽗⼦进程关系
⽗⼦进程都是独⽴的进程,⽗进程可以管理⼦进程,这种管理主要体现在三个⽅⾯:⽣、管、死。
“⽣”:⽗进程可以创建⼦进程。
“管”:命令 export 的操作就属于管理。
“死”:⽗进程死则⼦进程必须死,⼦进程死对⽗进程没有影响。
(三)⼦ shell 如何访问⽗ shell 的变量(export 实现原理)
在⽗ shell 中执⾏⼀个⼦ shell(执⾏命令 bash 就是执⾏⼀个⼦ shell),会启动⼀个⼦进程,即⼦ shell
是⼀个独⽴于⽗ shell 的进程,因此⽗⼦ shell 的存储空间是相互不可访问的(即⼦ shell ⽆法访问⽗ shell 中的变量),如果想让⼦ shell 访问⽗ shell 的变量就需要将该变量从⽗ shell 的独⽴存储空间复制到⼦ shell 的独⽴存储空间,⼦ shell 所看到的⽗进程的变量其实是⾃⼰进程空间的内容,⽽不是⽗进程的内容,只是该变量的名称和值与⽗进程相同⽽已。⽽命令 export 就是将⽗进程空间的内容复制到⼦进程的存储空间,也就是说命令export 的作⽤就是将⽗进程的局部变量变成全局变量,即所谓变成环境变量。
(四)⽗ shell 如何访问⼦ shell 的变量
⽗进程可以将⾃⼰的环境变量写⼊到⼦进程的空间中,但是⼦进程⽆法将⾃⼰空间的数据写⼊到⽗进程中(⾄少 export 命令做不到)。那么想要让⼦ shell 中的变量在⽗ shell 可见,最好的办法就是不要成为⼦ shell,即只将该 shell 中的内容导⼊到⽗ shell 中(即将被调⽤的脚本内容复制到⽗ shell 中直接执⾏),⽽不单独执⾏该 shell 脚本⽂件。这样⽤到的导⼊命令是 。
(五)export 作⽤范围
命令 export 可新增,修改或删除环境变量,供后续执⾏的程序使⽤,但是 export 产⽣的效果仅在本次会话中有效。
举例说明,将路径 /opt/au1200_rm/build_tools/bin 追加到环境变量 PATH 中:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
1. 为什么当前 shell 中执⾏ export 所产⽣的效果仅在本次会话中有效呢?
看上述的命令可知环境变量 PATH 早已经声明和定义过,这条指令是先获取变量 PATH 的旧值再拼接新的路径最后得到新的路径字符串,再将此字符串赋值给变量 PATH,所以此条指令只是将当前进程中的栈内存的环境变量 PATH 重新赋值⽽已,并将其定义为可输出的变量,这样每次创建⼦进程时就可以将此变量复制到⼦进程的内存空间中。
当进程结束后,内存空间被释放回收了,所以属于该进程的变量⾃然也被回收了。当再次创建 shell 进程时,加载到新进程内存空间的环境变量 PATH 是从配置⽂件读取的,相当于说环境变量 PATH 恢复原值了。
2. 如何设置永久的环境变
在 /etc/profile ⽂件中声明定义环境变量,那么每次创建进程的时候,就都可以获取到该变量的值。
[root@htlwk0001host ~]# vi /etc/profile
在⾥⾯加⼊:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
修改配置⽂件 /etc/profile 是对所有的⽤户有效,建议修改⽤户家⽬录下的配置⽂件 .bashrc 或 .bash_profile,这两个配置⽂件仅对当前登录⽤户有效。
注:在全局配置⽂件 /etc/profile 中,如果把变量定义成上述的语句,那么第⼀个进程创建时变量 $PATH 的取值必然为空,因为没有⽗进程,所以谈不上复制⽗进程的全局变量。第⼀个进程创建时先读取 /etc/profile ⽂件,此时第⼀个进程的内存中根本不存在变量 $PATH,所以何来“旧值”替换。
3. 为什么在 /etc/profile ⽂件中声明定义的变量是永久有效的呢?
我们每次打开⼀个命令窗⼝,就是创建⼀个 shell 进程,⽽且这个进程是⽗进程,会先读取 /etc/profile ⽂件,所以每次创建进程的时候都可以获取到 /etc/profile ⽂件⾥⾯的变量。
⼦进程不会读取任何的配置⽂件,⼦进程的栈内存中的变量都是从⽗进程复制过来的,当然必须是标记为 “export” 的变量才会复制到⼦进程的内存空间中。
三、常⽤选项
选项说明
-f代表[变量名称]中为函数名称
-n删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执⾏环境中
-p列出所有的 shell 赋予程序的环境变量
四、命令⽰例
(⼀)列出当前所有的环境变量
[root@htlwk0001host ~]# export -p
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/0/bus"
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
(⼆)声明定义环境变量
[root@linuxcool ~]# export MYENV=7
注意:仅在当前登录会话有效,退出后就失效了。
(三)显⽰某个环境变量的值
[root@htlwk0001host ~]# echo $HOME
/root
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论