Bash(Bourne-Again Shell)是 Linux 和 macOS 系统中最广泛使用的命令行解释器——你在终端里输入的每一条命令,几乎都是经过 Bash 解析后交给操作系统执行的。即使是在 Windows 上,通过 WSL(Windows Subsystem for Linux)或 Git Bash 也能获得完整的 Bash 环境。掌握 Bash 常用命令,意味着你能够高效地浏览文件系统、搜索文本、管理进程、组合命令完成复杂任务,而不必依赖图形界面。

文件与目录操作

文件与目录操作是 Bash 使用频率最高的一组命令,涵盖了”我在哪、有什么、怎么去、怎么建、怎么删”五个核心场景。

导航与查看:pwd / ls / cd

pwd(print working directory)显示当前所在的绝对路径,是最简单的”我在哪”命令:

$ pwd 
/home/user/projects

ls(list)列出目录内容。加 -l 显示详细信息(权限、大小、修改时间),加 -a 显示隐藏文件(以 . 开头的文件),加 -h 以人类可读格式显示文件大小:

$ ls -lah
total 24K
drwxr-xr-x  3 user user 4.0K Aug 19 10:00 .
drwxr-xr-x  5 root root 4.0K Aug 18 22:00 ..
-rw-r--r--  1 user user  220 Aug 19 09:30 .gitignore
-rw-r--r--  1 user user 1.2K Aug 19 09:35 README.md
drwxr-xr-x  2 user user 4.0K Aug 19 09:40 src

cd(change directory)切换工作目录。几个常用简写:cd .. 返回上级目录,cd ~ 回到用户主目录,cd - 返回上一次所在的目录:

$ cd /var/log        # 切换到 /var/log
$ cd ..             # 返回上级 /var
$ cd ~              # 回到 /home/user
$ cd -              # 回到刚才的 /var

创建与删除:mkdir / touch / cp / mv / rm / rmdir

mkdir(make directory)创建目录,-p 参数可递归创建多层嵌套目录:

$ mkdir reports
$ mkdir -p reports/2026/q3/charts    # 一次创建多层目录

touch 创建空文件或更新已有文件的时间戳——如果文件不存在,则创建空文件;若存在,则将其访问和修改时间更新为当前时间:

$ touch newfile.txt   # 创建空文件
$ touch newfile.txt   # 再次 touch 只更新时间戳
$ touch -t 202601011200 oldfile  # 将 oldfile 的时间戳设为 2026-01-01 12:00

cp(copy)复制文件或目录。常用选项:-r 递归复制目录、-i 覆盖前询问、-p 保留源文件属性(权限、时间戳等)、-u 仅在源更新时复制(增量备份):

$ cp script.sh backup.sh      # 复制文件
$ cp -r project/ project_bak/ # 复制整个目录
$ cp -ip file.txt /dest/      # 复制并保留属性,遇重名询问

mv(move)移动或重命名文件——在 Bash 中,重命名和移动是同一个操作:若目标为目录,则移动源到该目录下;若目标为文件名,则重命名。常用选项:-i(覆盖前询问)、-f(强制覆盖)、-u(仅在源更新时移动):

$ mv file1.txt file2.txt   # 重命名
$ mv data/ /tmp/           # 将 data 目录移动到 /tmp 下
$ mv -i *.pdf ~/Documents/ # 移动 PDF 文件,遇重名询问

rm(remove)删除文件或目录。-r 递归删除目录,-f 强制删除不提示。这两者组合 -rf 需要格外谨慎,因为删除后不可恢复:

$ rm temp.log                 # 删除单个文件
$ rm -r old_project/           # 递归删除目录
$ rm -rf build/               # 强制递归删除(危险!无确认)

安全建议:在不确定路径正确性时,先用 ls 确认目标,再执行 rm;或使用 rm -i 让 Bash 逐个确认。永远不要对 / 根目录执行 rm -rf

rmdir(remove directory)删除空目录。与 rm -r 不同,rmdir 只能删除空目录,目录非空时报错——这反而是一种安全特性:

$ rmdir empty_dir          # 删除空目录
$ rmdir -p a/b/c           # 递归删除空目录链(先删 c,再删 b,再删 a)

链接:ln

ln(link)创建链接。-s 创建符号链接(软链接),类似于 Windows 的快捷方式;不加 -s 则创建硬链接,硬链接与原文件共享同一个 inode:

$ ln -s /usr/bin/python3 /usr/local/bin/python   # 创建软链接
$ ln data.txt hardlink.txt                        # 创建硬链接

查找文件:find

find 是功能最强大的文件搜索命令,支持按名称、类型、大小、时间等多种条件组合查找:

$ find . -name "*.py"                    # 当前目录下所有 .py 文件
$ find /var/log -name "*.log" -mtime -7   # 最近 7 天修改过的日志
$ find . -type d -name "test"             # 查找名为 test 的目录
$ find . -size +100M                     # 大于 100MB 的文件
$ find . -name "*.tmp" -delete            # 查找并删除 .tmp 文件

以下是文件与目录操作命令的速查汇总:

命令 用途 常用参数 示例
pwd 显示当前目录 pwd
ls 列出目录内容 -l 详情,-a 含隐藏,-h 可读大小 ls -lah
cd 切换目录 .. 上级,~ 主目录,- 上一次 cd ~/projects
mkdir 创建目录 -p 递归创建 mkdir -p a/b/c
touch 创建空文件/更新时间戳 -t 指定时间戳 touch new.txt
cp 复制文件/目录 -r 递归,-i 确认,-p 保留属性,-u 增量 cp -r src/ backup/
mv 移动/重命名 -i 确认,-f 强制,-u 增量 mv old.txt new.txt
rm 删除文件/目录 -r 递归,-f 强制,-i 确认 rm -rf build/
rmdir 删除空目录 -p 递归删除空目录链 rmdir empty/
ln 创建链接 -s 软链接 ln -s target link
find 查找文件 -name 按名,-type 按类型,-size 按大小,-mtime 按时间 find . -name "*.log"

文本查看与搜索

在命令行环境下,查看文件内容、搜索关键文本是日常高频操作。Bash 提供了从简单到强大的完整工具链。

查看文件内容:cat / less / head / tail

cat(concatenate)连接文件并输出到标准输出,常用于快速查看小文件、合并文件或从标准输入创建文件:

$ cat file.txt             # 显示文件内容
$ cat file1.txt file2.txt  # 合并两个文件的内容输出
$ cat > new.txt            # 从标准输入创建文件(Ctrl+D 结束)

less 是分页查看器,适合查看长文件——支持上下滚动、搜索(输入 / 后跟关键词),按 q 退出。与 cat 不同,less 不会一次性将所有内容刷屏:

$ less /var/log/syslog
# 进入 less 后:
#   /error    向下搜索 "error"
#   ?error    向上搜索 "error"
#   n        跳到下一个匹配
#   N        跳到上一个匹配
#   G        跳到文件末尾
#   g        跳到文件开头
#   q        退出

head 和 tail 分别查看文件开头和末尾。默认各显示 10 行,-n 参数可指定行数,-c 指定字节数。tail -f 是实时追踪文件追加内容的利器,常用于查看日志:

$ head -n 5 data.csv            # 前 5 行
$ tail -n 20 error.log          # 末 20 行
$ tail -f /var/log/app.log      # 实时追踪日志(Ctrl+C 退出)

文本搜索:grep / rg

grep(global regular expression print)是 Linux 下最常用的文本搜索工具,按模式匹配行并输出。核心参数:-i 忽略大小写,-v 反向匹配(输出不包含模式的行),-n 显示行号,-r 递归搜索目录,-c 只输出匹配行数,-E 启用扩展正则表达式:

$ grep "error" app.log                    # 搜索含 "error" 的行
$ grep -i "warning" app.log                # 忽略大小写
$ grep -n "TODO" *.py                     # 显示行号
$ grep -rn "function" src/                # 递归搜索 + 行号
$ grep -v "^#" config.conf               # 排除以 # 开头的注释行
$ grep -c "Exception" error.log           # 只统计匹配行数
$ grep -E "cat|dog|bird" animals.txt      # 扩展正则:匹配 cat 或 dog 或 bird

grep 常用正则表达式速查:

模式 含义 示例
^text 以 text 开头 grep "^import" *.py
text$ 以 text 结尾 grep "\.py$" filelist
. 匹配任意单个字符 grep "c.t" words(匹配 cat、cut 等)
.* 匹配任意长度的任意字符 grep "a.*z"(a 到 z 之间任意内容)
[abc] 匹配 a、b 或 c 中任一 grep "[Hh]ello"
[^abc] 不匹配 a、b、c grep "[^0-9]" data(非数字行)
\< / \> 词首 / 词尾边界 grep "\<error\>" log(精确匹配 error 单词)
\{n,m\} 前一个字符出现 n 到 m 次 grep "o\{2,4\}" words(oo 到 oooo)

rg(ripgrep)是更快、更现代的 grep 替代品——默认递归搜索,自动忽略 .gitignore 中的文件和二进制文件,支持正则,输出带颜色。语法:rg [选项] 模式 [路径]。常用选项:-i 忽略大小写、-n 显示行号、-t 按文件类型过滤(如 -tpy 只搜 Python 文件)、-g 包含/排除 glob 模式:

$ rg "function" .                 # 递归搜索当前目录
$ rg -i "todo" --type markdown    # 只在 Markdown 文件中搜索 todo(忽略大小写)
$ rg -g "!*.log" "error" src/     # 排除 .log 文件

若系统未安装 rg,可通过包管理器安装(如 apt install ripgrepbrew install ripgrep)。

文本统计与处理:wc / sort / uniq / cut / tr

wc(word count)统计文件的行数、单词数和字符数。-l 只统计行数,-w 只统计单词数,-c 统计字节数,-m 统计字符数:

$ wc -l access.log          # 统计行数
$ wc -w essay.txt           # 统计单词数
$ wc -c data.bin            # 统计字节数
$ wc -m file.txt            # 统计字符数

sort 对文本行排序。-n 按数值排序,-r 逆序,-k 按指定列排序,-u 排序同时去重,-t 指定字段分隔符(默认空白):

$ sort scores.txt              # 字母序排序
$ sort -n scores.txt           # 数值排序
$ sort -rn scores.txt          # 数值逆序(从大到小)
$ sort -t, -k2 data.csv        # 以逗号分隔,按第 2 列排序

uniq 去除相邻的重复行。通常需要先用 sort 排序后再用 uniq,因为 uniq 只去除连续重复行。-c 在行首显示重复次数:

$ sort access.log | uniq -c | sort -rn | head -10
# 组合用法:统计日志中各 IP 出现频率,取前 10

cut 按分隔符或列号提取文本。-d 指定分隔符,-f 指定字段号:

$ cut -d: -f1 /etc/passwd         # 提取用户名(第 1 列)
$ cut -d, -f2,3 data.csv         # 提取 CSV 第 2、3 列
$ cut -c1-10 file.txt            # 提取每行前 10 个字符

tr(translate)替换或删除字符,常用于大小写转换或删除多余字符:

$ echo "Hello World" | tr 'a-z' 'A-Z'     # 转大写
HELLO WORLD
$ echo "a,b,c" | tr ',' '\n'             # 逗号替换为换行
$ cat file.txt | tr -d '\r' > file_unix  # 删除 Windows 回车符

文本流编辑与比较:awk / sed / diff

awk 是面向”列”的文本处理工具,用「模式 {动作}」逐行处理文本,是命令行数据分析的利器:

$ awk '{print $1}' users.txt           # 打印每行第 1 列(默认按空白分隔)
$ awk -F, '{print $2, $3}' data.csv    # 指定逗号分隔,打印第 2、3 列
$ awk '$3 > 90 {print $1}' scores.txt  # 第 3 列大于 90 时打印第 1 列
$ awk 'NR >= 2 && NR <= 5' log.txt     # 打印第 2 到 5 行

awk 中 $0 表示整行、NF 表示字段数、NR 表示当前行号;它本质是一门完整的脚本语言,还支持 BEGIN/END 块、循环和数组。

语法:sed [选项] '命令' 文件sed(stream editor)是流编辑器,对文本进行过滤和转换,最常用于”查找替换”。常用命令:s/旧/新/ 替换、d 删除、p 打印、a/i 追加/插入。常用选项:-i 直接修改文件(慎用,建议先备份)、-n 抑制默认输出(配合 p 使用):

$ sed 's/foo/bar/g' file.txt        # 将所有 foo 替换为 bar(全局)
$ sed -n '5,10p' data.txt           # 只打印第 5 到 10 行
$ sed '/^#/d' config.conf           # 删除所有以 # 开头的注释行
$ sed -i.bak 's/old/new/' file.txt  # 替换并备份原文件

语法:diff [选项] 文件1 文件2diff 比较两个文件或目录的差异,常用于代码审查和版本对比。常用选项:-u 以统一格式输出(更易读)、-r 递归比较目录、-q 仅报告是否有差异(不显示详情):

$ diff -u old.sh new.sh          # 显示统一差异格式
$ diff -r dir1/ dir2/            # 比较两个目录
$ diff -q file1 file2            # 只报告是否相同

进程管理与系统信息

在服务器运维和开发调试场景中,查看进程状态、管理系统资源、排查网络与用户是必不可少的技能。

进程查看与控制:ps / top / htop / kill

ps(process status)列出当前运行的进程。aux 组合是最常用的形式,显示系统中所有进程的详细信息:

$ ps aux                      # 列出所有进程
$ ps aux | grep nginx        # 查找 nginx 进程
$ ps -ef | grep python       # 另一种常用形式

ps aux 输出的各列含义如下:

含义 典型值
USER 进程所有者 root / www-data
PID 进程 ID 1234
%CPU CPU 占用率 2.3
%MEM 内存占用率 1.5
VSZ 虚拟内存大小(KB) 256000
RSS 物理内存使用量(KB) 32456
STAT 进程状态 R(运行)/S(睡眠)/Z(僵尸)/D(不可中断)
START 启动时间 10:30 或 Aug 19
COMMAND 启动命令 /usr/bin/python3 app.py

top 提供实时动态的进程监控视图,默认每 3 秒刷新一次。在 top 界面中按 P 按 CPU 排序,按 M 按内存排序,按 q 退出。

htop 是 top 的增强版(需额外安装,如 apt install htop 或 brew install htop),提供彩色界面和鼠标操作:F3 搜索进程、F4 过滤、F5 树状视图、F6 排序、F9 终止进程、F10 退出:

$ htop

kill 向进程发送信号,最常用于终止进程。kill PID 发送 SIGTERM(优雅终止),kill -9 PID 发送 SIGKILL(强制终止,不可被忽略),killall name 按进程名终止:

$ kill 1234                  # 优雅终止 PID 1234
$ kill -9 1234               # 强制终止
$ killall nginx              # 终止所有名为 nginx 的进程
$ pkill -f "python app.py"   # 按命令行模式匹配终止

优先使用 kill PID(SIGTERM),给进程保存数据和清理资源的机会;只有在进程无响应时才用 kill -9(SIGKILL),因为后者直接在内核层面终止进程,可能导致数据丢失。

后台任务管理:& / jobs / fg / bg

在命令末尾加 & 可将任务放到后台运行,Shell 立即返回提示符;jobs 查看后台任务列表,fg/bg 在前后台之间切换:

$ sleep 100 &          # 后台运行,立即返回提示符
[1] 12345              # 方括号内是任务编号,后面是 PID
$ jobs                 # 查看后台任务
[1]+  Running                 sleep 100 &
$ fg %1                # 将任务 1 调到前台
$ bg %1                # 将挂起的任务 1 放到后台继续运行

前台任务按 Ctrl+Z 会挂起(暂停),再用 bg 转到后台继续运行;fg/bg 后用 %任务编号 指定具体任务。

系统资源信息:df / du / free / uname / uptime

df(disk free)查看磁盘空间使用情况,-h 以人类可读格式显示:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   32G   16G  67% /
tmpfs           4.0G     0  4.0G   0% /dev/shm

du(disk usage)查看目录或文件占用的磁盘空间,-s 只显示总计,-h 可读格式:

$ du -sh /var/log       # 查看日志目录总大小
$ du -sh *              # 当前目录各子项大小
$ du -h --max-depth=1 /  # 根目录下一级各目录大小

free 查看内存使用情况,-h 可读格式,-m 以 MB 为单位:

$ free -h
              total   used    free   shared  buff/cache  available
Mem:           8.0G   2.3G   3.1G   128M       2.6G       5.2G
Swap:          2.0G   0.0B   2.0G

uname(unix name)显示系统信息,-a 显示全部:

$ uname -a
Linux my-server 5.15.0-76-generic #84-Ubuntu SMP x86_64 GNU/Linux

uptime 显示系统运行时长和负载情况:

$ uptime
11:20:01 up 5 days,  2:31,  2 users,  load average: 0.08, 0.03, 0.01

load average 后面的三个数字分别表示过去 1、5、15 分钟的平均负载——当数值接近或超过 CPU 核数时,说明系统负载偏高。

网络工具:netstat / curl / wget

netstat 查看网络连接和端口监听情况,是排查服务是否启动、端口是否被占用的首选工具。常用组合:-t 只看 TCP、-l 只看监听、-n 数字显示、-p 显示进程:

$ netstat -tlnp    # 查看 TCP 监听端口及对应进程
$ netstat -an      # 查看所有连接
$ netstat -rn      # 查看路由表

部分新系统已用 ss 替代 netstat,用法一致:ss -tlnp

curl 是功能强大的数据传输工具,支持下载、上传与 API 请求:

$ curl -O https://example.com/file.zip   # 下载文件并保持原文件名
$ curl -I https://example.com/           # 只查看响应头
$ curl -X POST -d "name=alice" https://api.example.com/users   # 发送 POST 请求

wget 专注于文件下载,支持断点续传与递归抓取:

$ wget https://example.com/file.zip      # 下载文件
$ wget -c https://example.com/big.zip    # 断点续传
$ wget -r -l 2 https://example.com/      # 递归下载 2 层页面

文件权限与状态:chmod / chown / stat

Linux 文件权限分为三组:所有者(owner)、组(group)、其他(others),每组有读(r=4)、写(w=2)、执行(x=1)三种权限。chmod(change mode)修改权限,chown(change owner)修改所有者和组:

$ chmod 755 script.sh        # rwxr-xr-x:所有者全权限,组和其他读+执行
$ chmod 644 config.conf      # rw-r--r--:所有者读写,组和其他只读
$ chmod +x deploy.sh         # 给所有用户添加执行权限
$ chmod -R 755 public/       # 递归修改目录及内容权限

$ chown user:group file.txt  # 同时修改所有者和组
$ chown user file.txt        # 只修改所有者
$ chown -R www:www /var/www  # 递归修改目录所有者

权限数字速查:

数字 权限 含义 典型场景
777 rwxrwxrwx 所有人全部权限 不推荐用于敏感文件
755 rwxr-xr-x 所有者全权限,其他读+执行 目录、可执行脚本
700 rwx—— 仅所有者全权限 SSH 私钥 (~/.ssh/id_rsa)
644 rw-r–r– 所有者读写,其他只读 普通配置文件
600 rw——- 仅所有者读写 敏感配置文件

stat 显示文件的详细状态信息,包括大小、权限(数字和符号)、inode 号以及访问/修改/状态更改时间:

$ stat file.txt
# 输出示例:File: file.txt,Size: 1234,Access: (0644/-rw-r--r--)...

用户管理:useradd / passwd / whoami

whoami 显示当前登录的用户名:

$ whoami
alice

useradd 创建新用户(需要 root 或 sudo 权限)。默认不创建家目录也不设置密码,-m 创建家目录、-s 指定登录 Shell:

$ sudo useradd -m -s /bin/bash alice   # 创建用户 alice,建家目录,指定 Shell

passwd 设置或修改密码——用户创建后必须设置密码才能登录:

$ sudo passwd alice   # 设置 alice 的密码
$ passwd              # 修改自己的密码

管道、重定向与 Shell 技巧

管道和重定向是 Bash 的精髓所在——它们让简单的命令能够组合成强大的数据处理流水线。掌握这几个符号,你就从”会用命令”升级为”会用命令行”。

管道:|

管道符 | 将前一个命令的标准输出(stdout)直接作为后一个命令的标准输入(stdin)。这是一种进程间通信机制,无需借助临时文件,多个命令可以串联成一条数据处理流水线。

一个经典的管道组合:ls | grep "txt" | wc -l——列出文件,过滤含”txt”的行,统计行数,最终输出一个数字。拆开看,ls 负责产出数据,grep 负责过滤,wc -l 负责汇总,三者各司其职,通过管道协作完成了一个完整的查询任务。

$ ls | grep "txt" | wc -l
5
$ ps aux | grep python | grep -v grep      # 找出 python 进程(排除 grep 自身)
$ cat access.log | grep "404" | wc -l      # 统计 404 错误数
$ history | grep "git" | tail -5           # 最近 5 条含 git 的命令

重定向:> / >> / < / 2>

Bash 中每个进程有三个标准数据流:标准输入(stdin,文件描述符 0)、标准输出(stdout,文件描述符 1)和标准错误(stderr,文件描述符 2)。默认情况下,stdin 来自键盘,stdout 和 stderr 都输出到终端屏幕。重定向操作符可以改变这些数据流的方向。

各操作符的具体行为:

操作符 方向 行为 示例
> stdout → 文件 写入文件(覆盖已有内容) ls > files.txt
>> stdout → 文件 追加到文件末尾 echo "done" >> log.txt
2> stderr → 文件 将错误信息写入文件 cmd 2> err.log
2>&1 stderr → stdout 合并 stderr 到 stdout cmd > all.log 2>&1
< 文件 → stdin 从文件读取输入 mysql < dump.sql
&> stdout+stderr → 文件 合并输出到文件(覆盖) cmd &> all.log
/dev/null 丢弃输出 黑洞设备,写入即消失 cmd 2>/dev/null
$ ls -l > file_list.txt          # 输出写入文件(覆盖)
$ echo "build OK" >> build.log   # 追加到日志
$ make 2> errors.txt             # 只捕获编译错误
$ make > build.log 2>&1           # 正常输出和错误都写入同一文件
$ mysql < backup.sql             # 从 SQL 文件恢复数据库
$ find / -name "*.tmp" 2>/dev/null   # 隐藏权限不足的错误信息

tee:既输出又保存

tee 就像管道中的一个”T 型三通”——它从 stdin 读取数据,同时输出到终端和文件。这在需要实时查看命令输出又想保存日志时非常有用:

$ make 2>&1 | tee build.log        # 屏幕和文件同时看到输出
$ ping google.com | tee ping.log    # 实时查看 ping 结果并保存

xargs:将输入转为参数

xargs 将标准输入转换为命令行参数。很多命令(如 rmmkdir)不接受管道输入,xargs 在管道和这些命令之间架起桥梁:

$ find . -name "*.bak" | xargs rm           # 查找并删除所有 .bak 文件
$ cat urls.txt | xargs curl -s             # 批量请求 URL 列表
$ find . -name "*.py" | xargs grep "main"  # 在所有 .py 文件中搜索

通配符

通配符(globbing)是 Bash 对文件名的模式匹配机制,在命令执行前由 Shell 展开:

通配符 含义 示例 匹配结果
* 匹配任意数量字符 *.py app.py, test.py, utils.py
? 匹配单个字符 file?.txt file1.txt, file2.txt(不匹配 file12.txt)
[abc] 匹配括号内任一字符 file[12].txt file1.txt, file2.txt
[a-z] 匹配范围内的字符 file[a-c].txt filea.txt, fileb.txt, filec.txt
{a,b} 展开为多个模式 *.{py,sh} 所有 .py 和 .sh 文件

变量与环境变量:echo / export

echo 输出文本或变量值,是 Shell 中最常用的”打印”命令:

$ echo "Hello World"        # 输出文本
$ echo $HOME                # 查看变量值($HOME 是主目录)
$ echo $?                   # 查看上一条命令的退出码(0 成功,非 0 失败)

export 将变量导出为环境变量,使其对当前 Shell 启动的子进程(脚本、程序)可见。直接 MY_VAR=hello 只对当前 Shell 有效,export 后子进程才能读到;要永久生效,写入 ~/.bashrc

$ export MY_VAR="hello"     # 导出环境变量
$ export PATH="$PATH:/opt/myapp/bin"   # 将新路径追加到 PATH

alias 与 history

alias 为常用命令创建简短别名,提高输入效率。别名通常写在 ~/.bashrc 或 ~/.bash_aliases 中以持久生效:

$ alias ll='ls -lah'           # ll 即 ls -lah
$ alias gs='git status'        # gs 即 git status
$ alias ..='cd ..'             # .. 即 cd ..
$ unalias ll                   # 取消别名

history 显示历史命令记录,配合 !!!$!n 可快速复用历史命令:

$ history | tail -10          # 最近 10 条命令
$ !!                          # 重复上一条命令(常用于 sudo !!)
$ !$                          # 上一条命令的最后一个参数
$ !42                         # 执行第 42 条历史命令
$ !git                        # 执行最近一条以 git 开头的命令

例如先执行 mkdir /tmp/backup,再输入 cd !$ 就相当于 cd /tmp/backup——!$ 会自动展开为上一条命令的最后一个参数。

常用快捷键

Bash 在终端中提供了丰富的快捷键,熟练使用后能显著提升操作效率:

快捷键 功能 使用场景
Tab 自动补全 补全命令名、文件名、路径
Ctrl+C 终止当前命令 停止运行中的进程
Ctrl+D 发送 EOF(退出) 退出当前 Shell 或关闭终端输入
Ctrl+Z 挂起进程到后台 暂停进程,用 fg 恢复、bg 后台继续
Ctrl+R 反向搜索历史命令 快速找回之前输入过的命令
Ctrl+L 清屏 等效于 clear
Ctrl+A 光标移到行首 快速编辑命令开头
Ctrl+E 光标移到行尾 快速跳到命令末尾
Ctrl+W 删除光标前一个单词 快速修改命令中的参数
Ctrl+U 删除光标前至行首 清空当前输入重新开始

结论

Bash 命令行的学习曲线在于”记不住”,但真正的诀窍不是死记硬背每个参数,而是理解几个核心概念:文件系统是一棵树(pwd/ls/cd 在树上移动)、每个进程有 stdin/stdout/stderr 三个通道(管道和重定向改变通道方向)、命令可以像积木一样组合(| 将输出喂给下一个命令)。

学 Bash 命令的最佳方式是在真实任务中反复使用,而非背诵命令列表。 每天挑两三个命令在实际工作中使用,遇到不确定的参数时用 man 命令名 查阅手册——几个月后,这些命令就会成为肌肉记忆。

0