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 操作的上下文。cdpushdpopd 不只是移动命令,也是在管理“当前命令会作用在哪里”。任何会删除、移动、生成文件的命令,执行前都应该确认 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/username

4. 键盘快捷键

快捷键功能描述
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 abc

9. 转义字符

Shell 中有四种引用/转义方式:

# 反斜杠(\)使后面的一个变量变为单纯的字符
 
$ echo \$HOME
$HOME
 
# 单引号(' ')转义其中所有的变量为单纯的字符串
 
$ echo '$HOME'
$HOME
 
# 双引号(" ")保留其中的变量属性,不进行转义处理
 
$ echo "$HOME"
/home/username
 
# 反引号(` `)把其中的命令执行后返回结果
 
$ echo `date`
Sun Sep 4 22:38:10 PDT 2023

10. 环境变量

在 Linux 系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。

Linux 系统中最重要的环境变量:

变量名称作用
HOME用户的主目录(即家目录)
SHELL用户在使用的 Shell 解释器名称
HISTSIZE输出的历史命令记录条数
HISTFILESIZE保存的历史命令记录条数
MAIL邮件保存路径
LANG系统语言、语系名称
RANDOM生成一个随机数字
PS1Bash 解释器的提示符
PATH定义解释器搜索用户执行命令的路径
EDITOR用户默认的文本编辑器
USER当前登录用户名
PWD当前工作目录
OLDPWD上一次工作目录

11. 获取帮助

使用 man 命令可以查看命令的帮助文档。

# 查看 man 的帮助文件
man man
 
# 查看 ssh 的帮助文件
man ssh

man 页面中常用导航按键:空格键向下翻页、/ 从上至下搜索关键词、? 从下至上搜索、n/N 定位下一个/上一个匹配、q 退出。

12. 使用原则

先读上下文pwdwhoamiecho $SHELLecho $PATH 经常比命令本身更重要。

交互习惯和自动化分开:别名、补全、历史增强适合提高个人效率;要交给 Agent、CI 或同事执行的动作,应该写成完整命令、脚本或任务入口。

变量和转义要保守:路径、空格、引号、通配符是 Shell 错误高发区。拿不准时先 echo、先加引号、先 dry-run。

帮助文档是第一来源:陌生命令先看 --helpman 或官方文档,再把稳定模式沉淀进自己的笔记。