Shell变量_环境变量设置
环境变量设置
环境变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。
shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建,但是用户退出shell终端,变量即丢失,如要永久生效,需要修改环境变量的配置文件
- 用户个人配置文件 /.bash_profile、/.bashrc 远程登录用户特有文件
- 全局配置文件 /etc/profile、 /etc/bashrc、且系统建议最好建在 /etc/profile.d/,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户
###修改个人的配置文件定义全局变量。
[mrxu@localhost myshell]$ cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
export name="徐先生"
[mrxu@localhost myshell]$
[mrxu@localhost myshell]$ echo $name
[mrxu@localhost myshell]$ source ~/.bash_profile
[mrxu@localhost myshell]$ echo $name
徐先生
[mrxu@localhost myshell]$ exit
exit
[root@localhost myshell]# echo ${name}
脚本变量
[root@localhost myshell]#
####在测试的时候遇到问题;修改mrxu用户下的 ~/.bash_profile文件添加全局变量name; 当用root登录时 su mrxu命令切换后查询变量值为空,只有source后才能加载出来,后查询原因只有su - mrxu 才会开启login shell,会加载到该配置文件; su mrxu 则开启no login shell不会加载到该配置文件
[root@localhost ~]# echo $name
[root@localhost ~]# su mrxu ###使用的no login shell
[mrxu@localhost root]$ echo $name
[mrxu@localhost root]$ exit
exit
[root@localhost ~]# su -mrxu ##语法错误需要空格
用法:
su [选项] [-] [USER [参数]...]
选项:
-, -l, --login 使 shell 成为登录 shell
[root@localhost ~]# su - mrxu
上一次登录:五 9月 1 10:45:07 CST 2023pts/0 上
[mrxu@localhost ~]$ echo $name
徐先生
[mrxu@localhost ~]$ exit
登出
[root@localhost ~]#
注意:
Login Shell
Login Shell通常是我们通过终端登录、切换到另一个账号以及使用ssh进行登录时创建的Shell环境。其一般是一次用户主动的第一次会话当中。
当创建Login Shell时,会按照下面顺序依次执行以下逻辑。
- 登录进程先执行
/etc/profile
/etc/profile
会执行/etc/profile.d/*
- 之后登录进程执行
~/.bash_profile
~/.bash_profile
会执行~/.bashrc
~/.bashrc
会执行/etc/bashrc
Non Login Shell
Non Login Shell通常是在Login Shell中创建的子Shell,比如在进程中创建Shell, 或者在Shell当中使用bash等命令创建一个子Shell,Non Login Shell通常无需进行用户登录、权限认证等逻辑。 所以你可以大胆的假设没有进行用户认证的Shell都是Non Login Shell。
需要注意的是,不是所有的用户登录的Shell都是Login Shell,它也有可能是Non Login Shell。比如当你通过su命令切换账号时却没有加上-时,此时Linux创建的是Non Login Shell。 su - work # Login Shell
su work # Non Login Shell
当创建Non Login Shell时,会按照下面顺序依次执行以下逻辑。
非登录进程会执行~/.bashrc
~/.bashrc会执行/etc/bashrc
/etc/bashrc 会在Non-Login Shell模式里执行 /etc/profile.d/
注意2:
- 每个用户都有自己的环境配置文件,/.bash_profile、/.bashrc,且以个人配置文件,优先加载变量,读取,以个人的优先生效。
- 当需要给所有用户都使用某个变量时,写入/etc/profile即可
[root@localhost ~]# cat -n /etc/profile
1 # /etc/profile
#.................
74
75 unset i
76 unset -f pathmunge
77 export name="徐先生管理员"
78
[root@localhost ~]# sh
sh-4.2# echo $name
徐先生管理员
sh-4.2# exit
exit
[root@localhost ~]# echo $name
徐先生管理员
[root@localhost ~]# su - mrxu ###mrxu下`~/.bash_profile`文件已调整name=徐先生;
上一次登录:五 9月 1 14:27:50 CST 2023pts/0 上
[mrxu@localhost ~]$ echo $name
徐先生
[mrxu@localhost ~]$ exit
登出
[root@localhost ~]# su mrxu
[mrxu@localhost root]$ echo $name #开启no login shell 不加载~/.bash_profile`
徐先生管理员
[mrxu@localhost root]$
检查系统环境变量的命令
- set 输出所有变量,包括全局变量,局部变量(脚本函数这类)
- env 只显示全局变量
- declare 输出所有的变量,如同set
- export , 显示和设置环境变量值
root@localhost ~]# set |wc -l
2849
[root@localhost ~]# set |grep ^name
name=徐先生管理员
[root@localhost ~]#
[root@localhost ~]# declare |wc -l
2850
[root@localhost ~]# set |wc -l
2850
[root@localhost ~]#
[root@localhost ~]# env |wc -l
48
[root@localhost ~]# export |wc -l
48
[root@localhost ~]#
撤销环境变量
- unset 变量名,删除变量或函数
[root@localhost ~]# su - mrxu
上一次登录:五 9月 1 14:34:06 CST 2023pts/0 上
[mrxu@localhost ~]$ echo $name
徐先生
[mrxu@localhost ~]$ unset name
[mrxu@localhost ~]$ echo $name
[mrxu@localhost ~]$ exit
登出
[root@localhost ~]# su - mrxu
上一次登录:五 9月 1 15:21:47 CST 2023pts/0 上
[mrxu@localhost ~]$ echo $name
徐先生
[mrxu@localhost ~]$
设置只读变量
- readonly ,只有shell结束,只读变量失效
[root@localhost ~]# readonly she="安娜"
[root@localhost ~]# she="tom"
bash: she: 只读变量
[root@localhost ~]#
系统保留环境变量关键字
bash内嵌了诸多环境变量,用于定义bash的工作环境。awk
#过滤出,格式化所有的环境变量名字
[root@localhost tmp]# export |awk -F '[ := ]' '{print $3}'
##
COLORTERM
DBUS_SESSION_BUS_ADDRESS
DESKTOP_SESSION
DISPLAY
XDG_SEAT
XDG_SESSION_DESKTOP
XDG_SESSION_ID
XDG_SESSION_TYPE
XDG_VTNR
XMODIFIERS
name
环境变量文件加载顺序
- 登录Linux,系统启动一个bash shell;bash会取若干系统环境文件,检查变量设置
- /etc/profile:全局环境变量文件, 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置
- 然后读取/etc/profile.d目录下的脚本,有系统诸多脚本,也放入自定义需要登录加载的脚本,便于用于登录后立即运行脚本
- 运行 $HOME/.bah_profile (用户环境变量文件)
- 运行$Home/.bashrc
.....
最后运行/etc/bashrc
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器