这是一份基于 the-art-of-command-line 简体中文版 的选编与实践导览,不是原仓库 ZIP。目标是建立可重复使用的 Bash 基本功,而不是收集看起来复杂的一行命令。
固定版本:6b50745d2e788add2e8f1ed29010e72659a9a074。示例主要面向 Linux Bash;Windows 可在 WSL 等可信 Unix 环境中练习,macOS 的部分命令参数可能不同。
1. 先学会求助,再背命令
man bash:浏览 Bash 手册,理解命令、参数、重定向、管道、变量和退出状态。command --help:快速查看某个命令支持的参数;把command换成实际命令。type command:确认名字最终指向别名、函数、内建命令还是可执行文件。man command或info command:在使用陌生参数前查语义。- 遇到长命令先拆成小段执行,并检查每一步输出。
建议熟悉一种终端文本编辑器。Vim 很常见,但不是唯一选择;关键是会打开、修改、保存、退出和不保存退出。
2. 文件操作:先看清楚,再修改
pwd
ls -la
mkdir -p practice
cd practice
cp source.txt backup.txt
mv backup.txt renamed.txt
less renamed.txt
Tab补全能减少路径拼写错误,但补全后仍要核对。cd -返回上一个目录,cd回家目录。cp -i、mv -i和rm -i可在覆盖或删除前询问,适合练习阶段。- 不要把
rm -rf、通配符或变量拼接当成“熟练”的证明。无法解释路径和影响范围时不执行。 - 文件名可能包含空格和换行。写脚本时使用正确引用,不依赖简单的按空格拆词。
练习:创建测试目录和三个文本文件,复制、重命名、查看并逐个删除,全程不碰测试目录之外的数据。
3. 重定向和管道:知道数据去了哪里
command > output.txt会覆盖目标文件;command >> output.txt追加。command 2> error.log保存标准错误;command > all.log 2>&1同时保存输出和错误。command1 | command2把前一个命令的标准输出送给后一个命令。$?是上一个命令的退出状态,0通常表示成功,非零需要查原因。- 管道默认只返回最后一个命令的状态。需要前段失败也使管道失败时,在 Bash 中使用
set -o pipefail。
printf 'alpha\nbeta\n' | grep alpha
grep -n 'error' application.log | head -n 20
不要凭终端“有输出”判断成功,也不要把生产错误直接重定向到 /dev/null 后忘记。
4. 文本处理:先用样例验证
grep -n 'pattern' file:查找并显示行号;正则表达式要注意 shell 引用。head、tail:查看开头或结尾;tail -f app.log持续观察日志。wc -l file:统计行数;sort和uniq可组合统计,但uniq通常处理相邻重复行。cut、awk:提取和计算列;先确认分隔符与样例数据。sed:流式编辑;先用无-i的版本看结果,再决定是否原地修改。jq:处理 JSON;比用正则解析结构化数据更可靠。xargs:把输入变成参数。文件名不规则时,优先了解-0与对应命令的 NUL 分隔输出。
printf '{"name":"demo","ok":true}\n' | jq '.name'
printf 'b\na\na\n' | sort | uniq -c
处理真实文件前保留备份,用十几行样例验证规则,再扩大到完整文件。
5. 进程与系统排查:从证据开始
ps aux或pgrep -af name:查进程,避免只凭进程名猜测。top:观察 CPU、内存和进程;批处理场景可了解htop等工具。df -h:看文件系统空间;du -sh directory看目录占用。free -h:看内存;不要只看单一的“空闲”数值。ss -lntp:在权限允许时查看监听 TCP 端口。ip addr、ip route:检查地址与路由。curl -I https://example.com:检查 HTTP 响应头;HTTPS 失败时还要核对证书和时间。dig example.com:检查 DNS;未安装时使用系统已有解析工具。journalctl -u service-name:查看 systemd 服务日志;生产环境避免把敏感日志贴到公开渠道。dmesg:查看内核消息,通常需要权限。
排查顺序:复现问题 → 明确时间和影响 → 看服务状态与日志 → 看资源、端口、网络和依赖 → 每次只改一个变量 → 验证并记录。
6. SSH:便利不能绕过主机验证
- 优先使用 SSH 密钥和最小权限账号,私钥权限只授予本人。
ssh user@example-host登录,scp或rsync传输前核对源和目标。- 可以在
~/.ssh/config为可信主机配置别名、用户、端口和保活参数。 - 不把
StrictHostKeyChecking=no当成通用修复。主机密钥变化应先通过独立渠道确认原因。 - 谨慎使用 Agent 转发;只在明确需要且信任目标主机时开启。
- 长连接需求可考虑 tmux 或 mosh,但先理解服务端要求和安全边界。
Host practice-server
HostName example-host
User practice-user
ServerAliveInterval 15
ServerAliveCountMax 3
这只是配置模板,不包含真实地址或密钥,不能直接假设它适用于你的服务器。
7. 单行命令的判断标准
好的单行命令应该可读、可解释、可回滚或有备份、对异常输入有边界。把命令粘贴到终端前,至少回答:
- 输入从哪里来,输出会覆盖什么?
- 通配符和变量会展开成什么?
- 任一段失败时,后续是否仍会执行?
- 是否泄露口令、令牌、个人信息或内网地址?
- 能否先在测试目录或小样例上验证?
shellcheck 可以辅助检查 Shell 脚本,但不能代替人工理解业务影响。
8. 七天练习与验收
- 第 1 天:阅读
man bash的常用章节,记录重定向、管道和退出状态。 - 第 2 天:只在测试目录练习文件操作,证明没有误伤其他文件。
- 第 3 天:把一段日志筛选、统计并保存结果,同时保留错误输出。
- 第 4 天:用
jq提取 JSON 字段,用awk处理规则分隔文本。 - 第 5 天:在本机复现一个端口或磁盘问题,写出排查证据链。
- 第 6 天:为测试主机写 SSH 配置,不关闭主机密钥检查。
- 第 7 天:把一个重复任务写成带注释脚本,加入错误处理并用 ShellCheck 检查。
验收标准不是记住多少命令,而是能从手册找到答案、解释每个参数、用样例验证,并在失败时保住数据。
来源、改动与许可
原作者为 Josh Levy,内容由众多作者和译者共同完善。本站删除 OSX/Windows 的过时细节和冷门命令,重新组织学习顺序,新增练习、安全边界及检查清单。
原作品及本站演绎专题均采用 Creative Commons Attribution-ShareAlike 4.0 International 许可。再分发或演绎时须保留适当署名、许可链接和修改说明,并以相同方式共享。