技术学习 · DoggyDad 原创
Shell 入门完全指南:从零开始掌握命令行
面向初学者的 Shell 使用教程,涵盖基础命令、文件操作、管道重定向等核心概念,帮助你快速上手命令行操作。基于 MIT Missing Semester 课程整理。
ANSWER-FIRST SUMMARY
本文回答什么问题
面向初学者的 Shell 使用教程,涵盖基础命令、文件操作、管道重定向等核心概念,帮助你快速上手命令行操作。基于 MIT Missing Semester 课程整理。
- 主题分类:技术学习
- 关键词:Shell、命令行、Linux、终端、入门教程、Bash
Shell 入门完全指南
什么是 Shell?
当你打开终端(Terminal)时,看到的那个等待你输入命令的界面,就是 Shell。
Shell 是一个命令行解释器,它接收你输入的文本命令,然后告诉操作系统去执行相应的操作。你可以把它想象成你和计算机之间的”翻译官”。
你输入命令 → Shell 解释 → 操作系统执行 → 返回结果
为什么要学 Shell?
你可能会问:有图形界面(GUI)为什么还要学命令行?
- 效率更高:很多操作用命令行比点鼠标快得多
- 自动化:可以编写脚本批量处理任务
- 远程操作:服务器通常只有命令行界面
- 更强大:有些操作只能通过命令行完成
- 程序员必备:几乎所有开发工具都需要命令行
Shell 的种类
最常见的 Shell 有:
| Shell | 说明 |
|---|---|
| Bash | 最流行的 Shell,Linux 默认 |
| Zsh | macOS 默认,功能更丰富 |
| Fish | 用户友好,自动补全强大 |
| PowerShell | Windows 的现代 Shell |
本文主要以 Bash 为例,但大部分命令在其他 Shell 中也通用。
第一步:打开终端
macOS
- 按
Cmd + Space,输入 “Terminal” - 或在 应用程序 → 实用工具 → 终端
Windows
- 安装 Windows Terminal
- 或使用 WSL(Windows Subsystem for Linux)
- 按
Win + R,输入cmd或powershell
Linux
- 按
Ctrl + Alt + T - 或在应用菜单中搜索 “Terminal”
Shell 基础概念
命令提示符(Prompt)
打开终端后,你会看到类似这样的内容:
username@hostname:~$
这就是命令提示符,它告诉你:
username:当前用户名hostname:计算机名称~:当前所在目录(~表示家目录)$:普通用户(#表示 root 用户)
执行第一个命令
试着输入 date 并按回车:
$ date
Sat Dec 14 10:30:00 CST 2024
恭喜!你刚刚执行了第一个 Shell 命令。
命令的基本结构
命令 [选项] [参数]
例如:
$ ls -l /home
ls:命令(列出目录内容)-l:选项(使用长格式显示)/home:参数(要列出的目录)
文件系统导航
理解路径
在 Shell 中,文件位置用路径表示:
-
绝对路径:从根目录
/开始的完整路径/home/username/documents/file.txt -
相对路径:相对于当前目录的路径
documents/file.txt
特殊目录符号
| 符号 | 含义 |
|---|---|
/ | 根目录(所有文件的起点) |
~ | 家目录(你的个人文件夹) |
. | 当前目录 |
.. | 上级目录 |
核心导航命令
pwd - 显示当前目录
$ pwd
/home/username
pwd = Print Working Directory(打印工作目录)
cd - 切换目录
# 进入指定目录
$ cd /home/username/documents
# 进入家目录
$ cd ~
$ cd # 不带参数也是回到家目录
# 返回上级目录
$ cd ..
# 返回上一个目录
$ cd -
ls - 列出目录内容
# 列出当前目录
$ ls
Desktop Documents Downloads
# 列出详细信息
$ ls -l
drwxr-xr-x 2 user user 4096 Dec 14 10:00 Desktop
drwxr-xr-x 5 user user 4096 Dec 14 09:30 Documents
# 显示隐藏文件(以 . 开头的文件)
$ ls -a
. .. .bashrc .config Desktop Documents
# 组合使用
$ ls -la
# 列出指定目录
$ ls /etc
ls -l 输出解读:
drwxr-xr-x 2 user group 4096 Dec 14 10:00 Desktop
│└──┬───┘ │ │ │ │ │ │
│ │ │ │ │ │ │ └─ 文件名
│ │ │ │ │ │ └─ 修改时间
│ │ │ │ │ └─ 文件大小(字节)
│ │ │ │ └─ 所属组
│ │ │ └─ 所有者
│ │ └─ 链接数
│ └─ 权限(rwx = 读/写/执行)
└─ 类型(d=目录,-=文件,l=链接)
文件和目录操作
创建
# 创建目录
$ mkdir my_folder
# 创建多级目录
$ mkdir -p parent/child/grandchild
# 创建空文件
$ touch newfile.txt
# 创建并写入内容
$ echo "Hello World" > hello.txt
复制
# 复制文件
$ cp source.txt destination.txt
# 复制到目录
$ cp file.txt /path/to/directory/
# 复制目录(需要 -r 递归)
$ cp -r source_folder destination_folder
移动和重命名
# 移动文件
$ mv file.txt /new/location/
# 重命名文件(本质上是移动)
$ mv oldname.txt newname.txt
# 移动目录
$ mv folder /new/location/
删除
# 删除文件
$ rm file.txt
# 删除目录(需要 -r 递归)
$ rm -r folder
# 强制删除(不提示确认)
$ rm -rf folder
# ⚠️ 警告:rm 删除的文件无法恢复!
查看文件内容
# 显示全部内容
$ cat file.txt
# 分页查看(按 q 退出)
$ less file.txt
# 查看前 10 行
$ head file.txt
$ head -n 20 file.txt # 前 20 行
# 查看后 10 行
$ tail file.txt
$ tail -n 20 file.txt # 后 20 行
# 实时查看文件更新(常用于日志)
$ tail -f logfile.log
获取帮助
遇到不熟悉的命令?有几种方式获取帮助:
man - 查看手册
$ man ls
按 q 退出,/ 搜索,n 下一个匹配。
—help 选项
$ ls --help
tldr - 简化版手册(推荐)
# 安装 tldr
$ npm install -g tldr
# 使用
$ tldr tar
tldr 提供简洁的常用示例,比 man 更容易理解。
输入输出重定向
Shell 的强大之处在于可以灵活地处理输入和输出。
标准流
每个程序都有三个标准流:
| 流 | 编号 | 说明 |
|---|---|---|
| stdin | 0 | 标准输入(键盘) |
| stdout | 1 | 标准输出(屏幕) |
| stderr | 2 | 标准错误(屏幕) |
输出重定向
# 将输出写入文件(覆盖)
$ echo "Hello" > output.txt
# 将输出追加到文件
$ echo "World" >> output.txt
# 重定向错误输出
$ command 2> error.log
# 同时重定向标准输出和错误
$ command > output.txt 2>&1
$ command &> all.log # 简写形式
输入重定向
# 从文件读取输入
$ sort < unsorted.txt
# Here Document(多行输入)
$ cat << EOF
第一行
第二行
第三行
EOF
管道(Pipe)
管道 | 是 Shell 最强大的特性之一,它将一个命令的输出作为另一个命令的输入。
# 基本语法
命令1 | 命令2 | 命令3
实用示例
# 查找包含 "error" 的行
$ cat log.txt | grep "error"
# 统计文件行数
$ cat file.txt | wc -l
# 排序并去重
$ cat names.txt | sort | uniq
# 查看目录中最大的 5 个文件
$ ls -lS | head -n 5
# 查找进程
$ ps aux | grep "python"
# 实时监控日志中的错误
$ tail -f app.log | grep "ERROR"
管道的思维方式
管道体现了 Unix 哲学:每个程序只做一件事,做好它,然后通过管道组合。
# 统计当前目录下 .js 文件的总行数
$ find . -name "*.js" | xargs wc -l | tail -1
常用命令速查
文件搜索
# 按名称查找文件
$ find /path -name "*.txt"
# 按内容搜索(grep)
$ grep "pattern" file.txt
$ grep -r "pattern" /path # 递归搜索
$ grep -i "pattern" file # 忽略大小写
$ grep -n "pattern" file # 显示行号
文本处理
# 统计行数、单词数、字符数
$ wc file.txt
$ wc -l file.txt # 只统计行数
# 排序
$ sort file.txt
$ sort -n file.txt # 数字排序
$ sort -r file.txt # 逆序
# 去重
$ uniq file.txt
$ sort file.txt | uniq # 通常配合 sort 使用
# 截取列
$ cut -d',' -f1 data.csv # 以逗号分隔,取第一列
系统信息
# 查看磁盘使用
$ df -h
# 查看目录大小
$ du -sh /path
# 查看内存使用
$ free -h
# 查看进程
$ ps aux
$ top # 实时监控
$ htop # 更好的 top(需安装)
# 查看系统信息
$ uname -a
网络相关
# 下载文件
$ curl -O https://example.com/file.zip
$ wget https://example.com/file.zip
# 测试网络连接
$ ping google.com
# 查看网络配置
$ ifconfig
$ ip addr # Linux 推荐
权限管理
理解权限
$ ls -l file.txt
-rw-r--r-- 1 user group 1024 Dec 14 10:00 file.txt
权限分为三组:
- 所有者(Owner):文件创建者
- 组(Group):所属用户组
- 其他(Others):其他所有人
每组有三种权限:
r(read):读取w(write):写入x(execute):执行
修改权限
# 使用符号模式
$ chmod u+x file.sh # 给所有者添加执行权限
$ chmod g-w file.txt # 移除组的写权限
$ chmod o=r file.txt # 设置其他人只读
# 使用数字模式(r=4, w=2, x=1)
$ chmod 755 script.sh # rwxr-xr-x
$ chmod 644 file.txt # rw-r--r--
修改所有者
# 修改所有者
$ chown newuser file.txt
# 修改所有者和组
$ chown newuser:newgroup file.txt
# 递归修改
$ chown -R user:group directory/
环境变量
环境变量是 Shell 中存储配置信息的方式。
查看环境变量
# 查看所有环境变量
$ env
$ printenv
# 查看特定变量
$ echo $PATH
$ echo $HOME
设置环境变量
# 临时设置(仅当前会话)
$ export MY_VAR="hello"
# 永久设置(添加到配置文件)
$ echo 'export MY_VAR="hello"' >> ~/.bashrc
$ source ~/.bashrc # 重新加载配置
重要的环境变量
| 变量 | 说明 |
|---|---|
PATH | 命令搜索路径 |
HOME | 家目录路径 |
USER | 当前用户名 |
SHELL | 当前使用的 Shell |
PWD | 当前工作目录 |
修改 PATH
# 添加新路径到 PATH
$ export PATH="$PATH:/new/path"
# 添加到配置文件使其永久生效
$ echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc
快捷键提升效率
掌握这些快捷键,让你的命令行操作飞起来:
光标移动
| 快捷键 | 功能 |
|---|---|
Ctrl + A | 移到行首 |
Ctrl + E | 移到行尾 |
Ctrl + B | 后退一个字符 |
Ctrl + F | 前进一个字符 |
Alt + B | 后退一个单词 |
Alt + F | 前进一个单词 |
编辑操作
| 快捷键 | 功能 |
|---|---|
Ctrl + U | 删除到行首 |
Ctrl + K | 删除到行尾 |
Ctrl + W | 删除前一个单词 |
Ctrl + Y | 粘贴删除的内容 |
Ctrl + L | 清屏 |
历史命令
| 快捷键 | 功能 |
|---|---|
↑ / ↓ | 浏览历史命令 |
Ctrl + R | 搜索历史命令 |
!! | 执行上一条命令 |
!$ | 上一条命令的最后一个参数 |
history | 查看命令历史 |
进程控制
| 快捷键 | 功能 |
|---|---|
Ctrl + C | 终止当前命令 |
Ctrl + Z | 暂停当前命令 |
Ctrl + D | 退出当前 Shell |
实战练习
练习 1:文件整理
创建以下目录结构并练习基本操作:
# 创建项目目录
$ mkdir -p project/{src,docs,tests}
# 创建一些文件
$ touch project/src/{main.py,utils.py}
$ touch project/docs/README.md
$ touch project/tests/test_main.py
# 查看结构
$ ls -R project
练习 2:日志分析
# 创建模拟日志
$ cat << EOF > app.log
2024-12-14 10:00:00 INFO Starting application
2024-12-14 10:00:01 DEBUG Loading config
2024-12-14 10:00:02 ERROR Database connection failed
2024-12-14 10:00:03 INFO Retrying connection
2024-12-14 10:00:04 INFO Connected successfully
2024-12-14 10:00:05 WARNING High memory usage
EOF
# 查找所有错误
$ grep "ERROR" app.log
# 统计各级别日志数量
$ cut -d' ' -f3 app.log | sort | uniq -c
练习 3:批量重命名
# 创建测试文件
$ touch file{1..5}.txt
# 查看文件
$ ls *.txt
# 批量添加前缀
$ for f in *.txt; do mv "$f" "backup_$f"; done
# 查看结果
$ ls backup_*
进阶学习资源
在线课程
- MIT Missing Semester - 本文的主要参考来源
- Linux Journey - 交互式学习
书籍推荐
- 《The Linux Command Line》- William Shotts(免费在线阅读)
- 《Learning the bash Shell》- O’Reilly
练习平台
- OverTheWire: Bandit - 通过游戏学习
- Terminus - 命令行冒险游戏
速查表
总结
Shell 是每个开发者的必备技能。记住这些要点:
- ✅ 从基础命令开始:
cd、ls、pwd、cat - ✅ 理解路径:绝对路径 vs 相对路径
- ✅ 善用管道
|组合命令 - ✅ 用
man或tldr查看帮助 - ✅ 多练习,熟能生巧
命令行看起来可能有点吓人,但一旦掌握,你会发现它是最高效的工具。
参考资料
- MIT Missing Semester - Course Shell
- The Missing Semester of Your CS Education (YouTube)
- GNU Bash Manual
最后更新:2024-12-14
DISCUSSION
评论与补充