Linux Bash(一)
认识与学习 BASH
1.1 硬件、内核与 Shell 的关系
① 三者层次结构:
硬件(Hardware)↑
内核(Kernel)↑
Shell(命令解释器)↑
用户(User)
- 硬件:CPU、内存、硬盘、网卡等。
- 内核(Kernel):操作系统的核心,负责管理硬件资源、文件系统、进程调度、内存管理、驱动接口等。
- Shell:内核的“外壳”,用户与系统交互的接口(命令行解释器)。
- 用户:通过 Shell 发出命令 → Shell 解析并调用内核 → 内核操作硬件 → 返回结果给用户。
② 底层原理与过程:
用户输入命令 → Shell 解析命令 → 调用系统调用(syscall)
→ 内核执行操作 → 返回结果到 Shell → 显示输出
③ Shell 的本质:
- 是一种运行在用户空间的命令解释器程序。
- 提供交互模式(命令行)和批处理模式(Shell脚本)。
1.2 为什么要学习命令行模式的 Shell?
① 一致性(Consistency)
- 图形界面在不同发行版之间差异大,但命令行在各种 Linux 系统中几乎通用。
- 远程管理(SSH)主要依赖命令行环境。
- 许多自动化工具(如 Ansible、Docker、K8s)底层依赖命令执行。
② Shell 脚本的威力
- 可将重复任务自动化(系统管理、部署、备份等)。
- 脚本语言 → 可编程接口 → 与系统资源深度结合。
- 提升效率、可维护性、稳定性。
1.3 系统的合法 Shell 与 /etc/shells
的功能
① /etc/shells
文件作用:
- 列出系统中允许使用的合法登录 Shell。
- 登录时,系统会检查用户设置的 Shell 是否在该文件中。
- 部分程序(如 FTP、chsh)也会参考此文件判断 Shell 合法性。
查看内容:
cat /etc/shells
常见输出示例:
/bin/bash
/bin/sh
/bin/zsh
/sbin/nologin
② 不同种类的 Shell:
Shell 名称 | 可执行文件路径 | 特点 |
---|---|---|
bash | /bin/bash | 默认、最常用,功能丰富,兼容 sh |
sh | /bin/sh | 最早的 Shell,简单、标准化 |
zsh | /bin/zsh | 高度可定制,功能强大(自动补全、美化) |
csh / tcsh | /bin/csh, /bin/tcsh | C语法风格,脚本不兼容 bash |
dash | /bin/dash | 启动快,Ubuntu 默认 /bin/sh |
/sbin/nologin | /sbin/nologin | 用于禁用登录(如系统用户) |
③ /sbin/nologin
的功能:
- 分配给系统服务账户或禁止登录的用户。
- 若用户尝试登录,将显示一条信息并拒绝进入 Shell。
- 示例:
grep nologin /etc/passwd
1.4 Bash Shell 的功能
Bash(Bourne Again SHell)不仅是命令解释器,也是一种功能强大的交互式环境,支持历史记录、补全、别名、作业控制、脚本自动化等高级功能。
(1)命令历史(History)
功能: 记录用户输入的命令,方便回顾与重复执行。
常用命令与操作:
操作 | 功能 |
---|---|
history | 显示历史命令列表 |
history n | 显示最近 n 条命令 |
!n | 执行历史列表中第 n 条命令 |
!! | 重复执行上一条命令 |
!keyword | 执行最近以 keyword 开头的命令 |
Ctrl + r | 向后搜索历史命令(交互式) |
~/.bash_history | 历史命令文件,登录时加载、退出时保存 |
(2)自动补全(Tab Completion)
功能: 使用 Tab
键自动补齐命令或文件路径。
Tab
:补全命令或文件名。Tab Tab
:显示所有可能的补全选项。- Bash 通过内建补全机制 +
/etc/bash_completion
实现。
示例:
cd /et<Tab> # 自动补全为 /etc/
(3)命令别名(Alias)
功能: 给复杂命令起短名,提高效率。
常用操作:
命令 | 功能 |
---|---|
alias | 查看当前定义的别名 |
alias ll='ls -l --color=auto' | 定义别名 |
unalias ll | 删除别名 |
echo "alias ll='ls -l --color=auto'" >> ~/.bashrc | 永久生效 |
原理说明:
- alias 是 Shell 的内部机制(解析时替换),不是环境变量。
- 定义的别名仅在当前会话有效,需写入
~/.bashrc
才能持久化。
(4)作业控制(Job Control)
功能: 同时管理多个进程,控制前后台运行。
命令/操作 | 功能 |
---|---|
command & | 将命令放入后台执行 |
jobs | 查看当前作业列表 |
fg %n | 将第 n 个作业调回前台 |
bg %n | 将第 n 个作业放到后台运行 |
Ctrl + Z | 暂停当前前台任务(转为后台“停止”状态) |
kill %n | 终止第 n 个作业 |
disown | 脱离当前 shell 控制(防止退出时被终止) |
示例:
sleep 100 &
jobs
fg %1
(5)Shell 脚本(Shell Script)
功能: 批量自动执行命令的文本文件。
基本格式:
#!/bin/bash
# 示例脚本
echo "Hello, Linux!"
执行方法:
bash script.sh
# 或赋予可执行权限后直接执行
chmod +x script.sh
./script.sh
(6)通配符(Wildcard)
通配符用于匹配文件名(而非正则表达式)。
通配符 | 含义 | 示例 |
---|---|---|
* | 匹配任意长度字符(含空) | ls *.txt 匹配所有 .txt 文件 |
? | 匹配任意单个字符 | ls file?.txt 匹配 file1.txt、fileA.txt |
[abc] | 匹配方括号内任一字符 | ls [ab]* 匹配以 a 或 b 开头的文件 |
[a-z] | 匹配字符范围 | ls [0-9]* 匹配以数字开头的文件 |
[!abc] | 匹配不包含这些字符的文件 | ls [!a]* 匹配不以 a 开头的文件 |
1.5 查询命令是否为 Bash Shell 内置命令:type
功能: 判断一个命令的来源,是内建命令、外部程序、别名、还是函数。
示例:
type cd
# cd is a shell builtintype ls
# ls is /bin/lstype alias
# alias is a shell builtintype -a echo
# echo is a shell builtin
# echo is /usr/bin/echo
Bash 中命令的四种来源
在终端输入一个命令(例如 ls
、cd
、alias
、myfunc
),Bash 会依次检查这个命令属于哪一类,并按照优先级来执行。
内建命令(Builtin Command)
- 由 Bash 自身实现 的命令,不依赖外部可执行文件。
- 执行速度快,因为不需要新建进程(直接在 Shell 内部运行)。
示例:
cd
alias
echo
pwd
history
type
set
export
type cd
# 输出:cd is a shell builtin
- 运行效率高;
- 通常与 Shell 环境紧密相关(如修改变量、切换目录等外部命令无法实现的操作)。
外部程序(External Command)
- 系统中独立存在的可执行文件(通常在
/bin
、/usr/bin
等路径下)。 - 执行时 Bash 会创建新的进程(调用
fork + exec
)。
示例:
ls
cat
grep
ping
vim
type ls
# 输出:ls is /bin/ls
- 独立于 Bash;
- 可以被其他 Shell 或程序调用;
- 位置由环境变量
$PATH
决定(Bash 会在 PATH 路径中依次查找)。
别名(Alias)
- 命令的文字替换规则;
- Bash 在解析命令时,会先检查是否为别名;
- 如果匹配,就用定义的内容替换成完整命令。
alias ll='ls -l --color=auto'
type ll
# 输出:ll is aliased to `ls -l --color=auto`
- 仅在当前 shell 有效;
- 不创建进程;
- 属于 语法层面替换,在命令解析阶段完成;
- 可写入
~/.bashrc
实现永久生效。
函数(Function)
- 由用户或脚本定义的命令集合;
- 在当前 Shell 进程中执行;
- 可接收参数
$1
、$2
等; - 功能类似脚本,但无需创建外部进程。
示例:
myfunc() {echo "Hello from myfunc!"
}type myfunc
# 输出:myfunc is a function
# myfunc () { echo "Hello from myfunc!"; }
- 比外部脚本运行快;
- 在当前 shell 中生效;
- 可通过
declare -f
查看所有函数。
1.6 命令执行与快速编辑操作
(1)命令换行输入
- 使用反斜杠
\
表示续行(命令未结束):
echo "This is a \
long command"
- 也可直接按
Enter
,Bash 会在命令不完整时自动换行继续输入(例如多引号、括号未闭合)。
(2)光标移动快捷键(命令行编辑)
Bash 使用 Readline 库 支持 Emacs 风格快捷键(默认模式)。
快捷键 | 功能 |
---|---|
Ctrl + A | 移动到行首(A → Ahead) |
Ctrl + E | 移动到行尾(E → End) |
Ctrl + U | 删除光标前的所有内容 |
Ctrl + K | 删除光标后的所有内容 |
Ctrl + W | 删除前一个单词 |
Alt + B | 向后移动一个单词(Back) |
Alt + F | 向前移动一个单词(Forward) |
Ctrl + L | 清屏(等同于 clear ) |
Ctrl + R | 搜索历史命令 |
Ctrl + C | 中断当前命令 |
Ctrl + D | 退出当前 shell(EOF) |