鸟哥的私房菜:认识 bash 基础与系统救援
一、系统与用户的 shell 配置
- 合法 shell 清单
系统支持的合法 shell 列表存储于/etc/shells
配置文件中。常见类型包括已被替代的/bin/sh
(现多指向/bin/bash
)、Linux 标准默认 shell/bin/bash
、集成 C 语言特性的/bin/tcsh
,以及逐步被取代的/bin/csh
。在基础安装的RockyLinux
训练环境中,该文件内容通常仅包含bash
与sh
两项。 - 默认 shell 查询机制
用户账户的默认 shell 配置存储于/etc/passwd
文件,具体表现为以冒号分隔的第七字段。可通过cut
命令实现精准提取,例如执行cut -d: -f1,7 /etc/passwd
指令,即可输出用户名与对应 shell 信息。 - shell 切换技术
用户可根据需求切换 shell 环境,但不同 shell 在变量定义语法上存在显著差异(如 bash 采用var='content'
,csh
使用set var = 'content'
)。切换前需确保目标 shell 已完成安装,以tcsh
为例,安装后可通过/bin/csh
指令实现环境切换。使用echo $0
可查询当前 shell 执行文件路径,而/sbin/nologin
作为系统账户的非交互 shell,默认未列入/etc/shells
,以此增强系统安全性。
二、变量定义规范
- 基础操作范式
变量定义遵循变量="变量内容"
格式,调用时可采用echo $变量
或echo ${变量}
两种等价形式。 - 语法约束规则
- 变量与内容间必须以等号直接连接,禁止存在空白字符。
- 变量名称由英文字母与数字构成,且首字符不得为数字。
- 包含空白字符的变量内容需使用引号界定(双引号保留特殊字符功能,单引号视为纯文本)。
- 特殊字符可通过转义字符
\
进行普通化处理。 - 支持嵌入指令输出结果,实现方式包括反单引号
指令
与$(指令)
两种语法。 - 变量扩展推荐使用
"$变量名称"
或${变量}
格式。 - 需在子进程中生效的变量需通过
export
命令转换为环境变量。 - 系统预设变量通常采用大写命名,自定义变量建议使用小写字母。
- 变量删除操作通过
unset 变量名称
指令完成。
三、环境变量的系统影响
- 关键环境变量解析
LANG
与LC_ALL
:控制系统本地化设置,直接影响date
等指令的输出语言。PATH
:定义可执行文件搜索路径,目录间以冒号分隔,搜索优先级遵循配置顺序。HOME
:指向用户主目录,与~
符号形成映射关系。MAIL
:指定mail
指令读取的邮件存储路径。HISTSIZE
:设定历史命令缓存数量。RANDOM
:生成 0 - 32767 范围内的随机整数。PS1
:定义命令行提示符格式,详细设置可查阅man bash
文档的PS1
章节。$?
:存储上一条指令的返回状态码,0 表示执行成功,非 0 表示执行异常。
- 典型应用场景
PATH
变量配置错误可能导致系统功能失效,例如将其仅设置为/bin
会致使部分指令无法正常调用;通过修改PS1
变量可实现命令提示符的个性化定制。
四、变量作用域与进程间通信
- 变量作用域特性
- 局部变量:仅在当前 shell 会话中生效,无法被子进程继承。
- 全局变量:存储于共享内存空间,可通过
export
命令实现跨进程传递。
- 父子进程变量传递机制
bash 创建的子进程仅继承父进程的全局变量,子进程的局部变量默认不回传至父进程。可使用set
、env
、export
等指令追踪变量在进程间的传递状态。
五、进程管理技术
kill
命令通过向进程发送信号实现管理功能,其中默认信号 15 用于正常终止进程,信号 9 用于强制终止。可结合 jobs -l
命令获取进程 PID,执行 kill PID号码
或 kill -9 PID号码
实现特定进程的关闭操作,如终止后台暂停的 vim
进程。
六、login shell 与 non-login shell
- 概念区分
- login shell:需进行用户认证的 shell 会话(如通过 tty2 登录或使用
su -
命令切换账户),启动时依次加载系统级配置文件/etc/profile
与用户级配置文件~/.bash_profile
(或~/.bash_login
、~/.profile
)。 - non-login shell:在现有交互环境中启动的 shell 会话(如图形界面终端),仅加载用户级配置文件
~/.bashrc
。
- 配置文件使用策略
建议将通用配置项置于~/.bashrc
文件以确保跨环境生效。在用户登出时,login-shell
环境会执行~/.bash_logout
文件,而non-login shell
环境则无此操作。

All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.