Shell 是工程环境里最基础的交互层。这里记录的是每天都会用到的操作底座:如何组织命令、移动目录、查历史、写别名、理解转义和环境变量。它不是命令大全,重点是让未来的自己能读懂一条命令为什么这样写,也能判断哪些习惯适合写进脚本和自动化。
1. Shell 简介
Shell(壳层)在计算机科学中指为用户提供用户界面的软件,通常指的是命令行界面的解析器。一般来说,这个词是指操作系统中提供访问内核所提供之服务的程序。内核不提供和用户的交互功能,Shell 充当人与内核之间的翻译官。
壳层(shell)这个说法起源于路易斯·普赞(Louis Pouzin),在 1964 年至 1965 年间首次提出,随后在 Multics 项目中首次被实现。Unix 上的第一个 shell 是肯·汤普逊以 Multics 上的 shell 为范本写出的 Thompson shell。
Unix Shell 家族中,Bash 和 Zsh 是主流交互式 shell,sh(Bourne shell)是基础。许多主流 Linux 系统默认使用 Bash(Bourne-Again SHell),macOS 自 2019 年起默认使用 Zsh。
2. 执行命令
命令 [命令参数] [命令对象]可选择的、可加或可不加的、非必需的参数使用中括号引起来,而命令所要求的、必须有的参数或对象值,则不带中括号。
- 命令名称:语法中的动词,表达想要做的事情,例如创建用户、查看文件、重启系统等。
- 命令参数:用于对命令进行调整,让命令更好地贴合工作需求。
- 命令对象:要处理的文件、目录、用户等资源名称,即命令执行后的承受方。
| 类别 | 示例 |
|---|---|
| 长格式 | man —help |
| 短格式 | man -h |
Linux 系统中的命令、参数、对象都是严格区分大小写的。
3. 目录移动
目录位置是 Shell 操作的上下文。cd、pushd、popd 不只是移动命令,也是在管理“当前命令会作用在哪里”。任何会删除、移动、生成文件的命令,执行前都应该确认 pwd。
cd:回到当前用户目录。cd ~:回到当前用户目录(方便切换到其他用户目录)。cd -:回到上次工作的目录。pushd path:存入 path 目录到目录栈。popd:移动到目录栈弹出的目录。
# 使用 cd 回到当前用户目录
$ cd
$ pwd
/home/username
# 使用 cd ~ 也可以回到当前用户目录
$ cd ~
$ pwd
/home/username
# 使用 cd - 回到上次工作的目录
$ cd /tmp
$ cd -
$ pwd
/home/username
# 使用 pushd 将目录存入目录栈
$ pushd /var
/var /home/username
# 使用 popd 移动到目录栈弹出的目录
$ popd
/home/username4. 键盘快捷键
| 快捷键 | 功能描述 |
|---|---|
| Tab | 自动补全命令或文件名 |
| Ctrl+C | 终止当前命令 |
| Ctrl+Z | 将当前进程放到后台 |
| Ctrl+D | 退出当前终端 |
| Ctrl+L | 清屏 |
| Ctrl+U | 删除从光标位置到行首的字符 |
| Ctrl+K | 删除从光标位置到行尾的字符 |
| Ctrl+A | 移动光标到行首 |
| Ctrl+E | 移动光标到行尾 |
| Ctrl+R | 反向搜索命令历史 |
| Ctrl+W | 删除光标前的一个单词 |
| Ctrl+Y | 粘贴由 Ctrl+U、Ctrl+K 或 Ctrl+W 删除的文本 |
| Ctrl+T | 交换光标处字符与之前的字符 |
| Alt+B | 向后移动一个单词(或 Ctrl+ 左箭头) |
| Alt+F | 向前移动一个单词(或 Ctrl+ 右箭头) |
| Ctrl+Shift+C | 复制(部分图形终端) |
| Ctrl+Shift+V | 粘贴(部分图形终端) |
5. 特殊符号
| 符号 | 功能描述 | 示例 |
|---|---|---|
!! | 引用上一条命令 | !! 再次执行上一条命令,常用于 sudo !! 提权重跑 |
!$ | 引用上一条命令的最后一个参数 | cp /some/long/path /another/path 后执行 cd !$ 等价于 cd /another/path |
!string | 引用最近一条以 string 开头的命令 | 之前执行过 ls -l,输入 !ls 再次执行 |
^string1^string2^ | 快速替换上一条命令中的字符串并执行 | 上一条是 cat a。txt,输入 ^。^. 替换为 cat a.txt |
&& | 逻辑 AND,前一个命令成功(退出状态为 0)才执行后一个 | command1 && command2 |
; | 命令分隔符,在一行中依次执行多个命令,不考虑前一个命令的成功与否 | command1; command2 |
> | 输出重定向,将命令输出写入文件(覆盖) | ls -l > file.txt |
>> | 追加输出重定向,将命令输出追加到文件末尾 | echo "hello" >> file.txt |
< | 输入重定向,使用文件作为命令的输入 | cat < file.txt |
| “ | 反引号,执行其中的命令并将输出作为另一个命令的参数 | echo "Today is \date`“` |
$( ) | 命令替换,类似于反引号但更易读 | echo "Today is $(date)" |
{ } | 大括号扩展,生成序列或列表 | echo {1..5} 输出 1 2 3 4 5 |
# | 注释符号,# 后面的内容不会被执行 | # This is a comment |
6. Tab 补全
Tab 补全是 Shell 的可发现性入口。它不仅减少输入,也能告诉你当前工具支持哪些子命令、参数和值。对陌生 CLI 来说,补全往往比搜索长文更直接。
$ cd
.ansible/ .config/ .wget-hsts index.html
.bash_history .lesshst ChangeMirrors.sh index.html.1
.bash_logout .profile DockerInstallation.sh
.bashrc .ssh/ aaaa/
.cache/ .sudo_as_admin_successful demo/ 7. History 历史
history 命令可以显示执行过的命令历史。
$ history
1 pwd
2 ls -l
3 ip addr
4 apt-get update
5 sudo apt-get update可以配合 Ctrl+R 反向搜索历史命令,或使用 !number 直接执行历史命令。历史记录很方便,但复制历史命令前要重新看上下文:路径、环境变量、目标主机和危险参数可能已经变了。
8. Alias 别名
一些常用命令可以用 alias 定义别名。别名适合个人交互,不适合团队脚本;脚本和 CI 应该写完整命令,避免依赖某个人的 Shell 配置。
$ alias abc='cat aa.txt'
$ abc
helloworld!
$ unalias abc9. 转义字符
Shell 中有四种引用/转义方式:
# 反斜杠(\)使后面的一个变量变为单纯的字符
$ echo \$HOME
$HOME
# 单引号(' ')转义其中所有的变量为单纯的字符串
$ echo '$HOME'
$HOME
# 双引号(" ")保留其中的变量属性,不进行转义处理
$ echo "$HOME"
/home/username
# 反引号(` `)把其中的命令执行后返回结果
$ echo `date`
Sun Sep 4 22:38:10 PDT 202310. 环境变量
在 Linux 系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。
Linux 系统中最重要的环境变量:
| 变量名称 | 作用 |
|---|---|
| HOME | 用户的主目录(即家目录) |
| SHELL | 用户在使用的 Shell 解释器名称 |
| HISTSIZE | 输出的历史命令记录条数 |
| HISTFILESIZE | 保存的历史命令记录条数 |
| 邮件保存路径 | |
| LANG | 系统语言、语系名称 |
| RANDOM | 生成一个随机数字 |
| PS1 | Bash 解释器的提示符 |
| PATH | 定义解释器搜索用户执行命令的路径 |
| EDITOR | 用户默认的文本编辑器 |
| USER | 当前登录用户名 |
| PWD | 当前工作目录 |
| OLDPWD | 上一次工作目录 |
11. 获取帮助
使用 man 命令可以查看命令的帮助文档。
# 查看 man 的帮助文件
man man
# 查看 ssh 的帮助文件
man sshman 页面中常用导航按键:空格键向下翻页、/ 从上至下搜索关键词、? 从下至上搜索、n/N 定位下一个/上一个匹配、q 退出。
12. 使用原则
先读上下文:pwd、whoami、echo $SHELL、echo $PATH 经常比命令本身更重要。
交互习惯和自动化分开:别名、补全、历史增强适合提高个人效率;要交给 Agent、CI 或同事执行的动作,应该写成完整命令、脚本或任务入口。
变量和转义要保守:路径、空格、引号、通配符是 Shell 错误高发区。拿不准时先 echo、先加引号、先 dry-run。
帮助文档是第一来源:陌生命令先看 --help、man 或官方文档,再把稳定模式沉淀进自己的笔记。