环境变量 & Shell 的理解

这篇博客详细介绍了Linux系统环境与用户环境的区别,强调了环境变量在多用户环境中的作用,包括系统级和用户级环境变量的配置及其生命周期。文章还探讨了命令的执行原理,解释了如何通过PATH变量找到并执行命令,以及Shell在其中的角色。最后,提到了命令行窗口的实现与Shell进程的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统环境 与 用户环境

我们知道 Linux 是一个多用户、多任务的操作系统,支持多用户协同工作。其中系统环境 就是 Linux 操作系统的运行环境。而用户环境,便是属于多用户的运行环境。

不同用户间的环境是隔离的,也就是说不同用户环境中的内容,如数据、程序、配置等都是不一样的。

若有一些配置或数据是可以被多用户共享的,那么我们可以定义在系统环境中。系统环境中的内容是可以被多个用户共用的。

环境变量类别

根据类别可以分为:

  1. 系统级环境变量:每个登录用户都可以读取到的环境变量
  2. 用户级环境变量:每个用户独有的环境变量,不同用户间的用户级环境变量具有隔离性

环境变量的生命周期

永久的(配置文件中设置):
  1. 系统级环境变量:需要在系统配置文件中配置
# 切换到 root 用户
$ su root

# 编辑系统环境配置文件
$ vim /etc/profile 

# 例如加入JDK环境变量(实际上就是在配置文件中定义个变量)
JAVA_HOME=/home/jdk1.8

# 执行source命令使其生效
source /etc/profile
  1. 用户级环境变量:需要在用户配置文件中配置
# 切到用户目录下
$ cd ~

# 编辑用户环境配置文件(不同系统使用的文件名称可能是不同的,比如 Redhat -> .bash_profile,Ubuntu -> .bashrc)
$ vim .bash
.bash_history  .bash_logout   .bash_profile  .bashrc

# 编辑用户配置文件(若没有,可以新建一个)
$ vim .bash_profile

# 例如加入JDK环境变量(实际上也是在配置文件中定义个变量)
JAVA_HOME=/home/jdk1.8

# 执行source命令使其生效
source ~/.bash_profile
临时的:
  1. 系统级环境变量:不考虑
  2. 用户级环境变量:定义一个属于当前用户的具有隔离性的临时变量(没有在用户环境配置文件中配置的变量)
# 命令行中设置
$ myVar=C99

# 使用 export 命令可以使子 Shell 进程中也可以获取到该变量
$ export myVar=C99

若是在 Shell script 文件中定义了变量myVar=xxx,无论是否被 export,当 Script 执行完毕后,变量就不存在了。可以先执行 Script 文件,在尝试在终端窗口中执行 echo $varInScript 进行输出测试。

并且在命令行中设置的临时变量,当结束当前 Shell 进程时(比如通过:exit 命令,或直接关闭终端窗口),就会随之而消失。

执行命令与 Shell 的关系

思考一个问题:ls、pwd、top、ps 等这样命令本质是什么?

# 通过 type 命令查看 ls 命令的类型
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls

# 通过 which 命令在复查一下 ls 命令实现的绝对路径
$ which ls
alias ls='ls --color=auto'
        /usr/bin/ls

$ ll /usr/bin/ls
-rwxr-xr-x 1 root root 117608 Nov 17  2020 /usr/bin/ls

ls命令来说,当我们执行该命令时,实际上是在调用执行一个二进制可执行文件,该文件在 /usr/bin 目录下。

再思考一个问题:命令行输入ls命令时,命令的实现文件是如何被找到的?

# 打印一下系统环境变量: PATH
$ echo ${PATH}
/www/server/nvm/versions/node/v6.14.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:

当我们在命令行中输入ls命令时,会搜索系统级环境变量PATH的路径值下,是否有对应的同名可执行文件,如果有则调用执行(与配置 Java 的环境变量一个意思)。

再再思考一个问题:搜索与调用的操作是谁完成的? 就是 Shell(例如 Bash)。

再再再思考一个问题:我们看到的命令行窗口是什么程序实现的?也是 Shell。我们甚至可以在命令行窗口 Shell 进程中再新启动一个 Shell 进程。

$ type -t bash
file
# 查看命令行窗口中的 Shell 进程 PID(30142)
$ ps -ef | grep bash
root      1769 30142  0 10:47 pts/0    00:00:00 grep --color=auto bash
root     30142 30138  0 10:28 pts/0    00:00:00 -bash

# 新启一个 Shell 进程
$ bash

# 查看 Shell 进程信息(PID 为1801的 Shell 进程的 PPID 正为30142)
$ ps -ef | grep bash
root      1801 30142  1 10:47 pts/0    00:00:00 bash
root      2006  1801  0 10:48 pts/0    00:00:00 grep --color=auto bash
root     30142 30138  0 10:28 pts/0    00:00:00 -bash

# 退出当前 Shell 进程
$ exit
exit

# 再次查看 Shell 进程信息
$ ps -ef | grep bash
root      2979 30142  0 10:52 pts/0    00:00:00 grep --color=auto bash
root     30142 30138  0 10:28 pts/0    00:00:00 -bash

# 再次退出当前 Shell 进程
$ exit 

SSH 127.0.0.1: session closed
按任意键重新连接...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值