/etc/profile /etc/profile.d/* /etc/bashrc ~/.bash_profile ~/.bashrc
/etc/profile /etc/profile.d/* /etc/bashrc ~/.bash_profile ~/.bashrc 这些文件定义shell的运行环境,其运行有先后,不同情况执行不同的文件
先说shell的分类:
登陆或非登陆
我们可以直接使用shell(直接运行bash,或者其他shell),此为非登陆式.shopt [-p] login_shell,login_shell不能使用shopt命令进行设置
也可以输入用户名,密码后,由/usr/bin/login程序激活shell,此为登陆式.比如直接登陆tty终端,或者远程登入pts终端
交互或非交互
1)在shell中 - 是一个变量,表示当前shell一些环境,如果含有 i (interactive),则表示为交互式shell
终端上执行echo $-
脚本中执行
必须以新进程执行脚本,不能使用source方式,否则,显示的是当前shell的变量 - 的值
2)查看变量PS1或PS2,非空,则为非交互式,否则为交互式,非交互式无需这两个变量,其值为空
脚本中则为空
常见shell登陆方式
- 通过Linux伪终端或虚拟终端登录,此为交互式登录shell
- 在命令行中直接bash,此为交互式非登录shell,加入--login后变为交互式登录shell(执行环境是不同的,读取不同环境文件)
- 直接su不加--login为交互式,非登录shell
su --login切换用户为交互式,登录shell
- ssh root@zz1 'echo $-;shopt login_shell'为非交互式,非登录shell
- 桌面环境打开的终端为交互式,非登录shell
接下来说明login和no-login的shell在加载shell环境文件的不同
/etc/profile中插入 打印信息
上面图中代码正是/etc/profile.d/下的文件被读取的原因,bash默认只读取*.sh后缀名的文件和sh.local文件,sh.local一般为空
/etc/bashrc中也插入打印信息
在/etc/bashrc中if ! shopt -q login_shell定义了只有为非登录shell时,/etc/bashrc会读取/etc/profile.d/*.sh下的文件,但是不包括sh.local
~/.bash_profile
~/.bashrc
执行bash --login模拟登录shell
从图中可了解登录shell的文件加载过程
1) /etc/profile --------------> /etc/profile.d/*.sh /etc/profile.d/sh.local
2)$HOME/.bash_profile -------------> $HOME/.bashrc ---------------> /etc/bashrc
下面为non-login的shell加载过程
$HOME/.bashrc -----------> /etc/bashrc -------------> /etc/profile.d/*.sh 不包括 /etc/profile.d/sh.local
non-login的shell必须从login的shell生成,故会继承父shell的环境变量
$HOME/.bash_logout 为每次退出系统时执行
/etc/profile为系统的所有用户设置环境信息,等用户登录时,bash会执行此文件,此文件中还会加载/etc/profile.d/下的相关文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律