课程内容#
Shell & Terminal & Console#
- shell:壳,软件,给用户提供一个接口
- console:控制台、工作台
- terminal:交互设备
- 本质就是文件
- stdin、stdout、stderr 分别对应 0、1、2 号文件
- 0、1、2 是文件描述符,打开任何一个进程,都会打开这 3 个文件
- echo $0:输出 - zsh,说明输入来源是 zsh
- stdout、stderr 输出重定向:1 > 文件,2 > 文件
console 和 terminal 的概念都源自大型机,console 可以看作为一个特殊的 terminal。现在用的一般都是引申义,一般情况下可以混用。
Linux 帮助系统#
- 两个在线文档:man (常用)、info
- man 手册模块
| 代号 | 代表的含义 | 举例 |
|:----|:----|:----|:----|:----|
|1|shell 命令或者可执行文件 | man 1 ls|
|2 | 内核提供的函数和工具 | man 2 reboot|
|3 | 库函数 [大部分 C 的函数库,没有 C++、Python...]|man 3 readdir|
|4 | 设备文件说明 [通常在 /dev]|man 4 null|
|5 | 配置文件或文件格式 [如 /etc/passwd]|man 5 interfaces|
|6 | 游戏 | man 6 lol|
|7 | 惯例与协议 [如 Linux 文件系统、网络协议]|man 7 tcp|
|8 | 系统管理员命令 [通常给 root 使用]|man 8 reboot|
|9 | 内核例程 [非标准例程]| |
|o | 旧文档 | |
|n | 新文档 | |
|l | 本地文档 | |
- 学会看 man 手册提供的 Example👉最佳实践
- ❗ 小技巧,针对命令可能存在于多个模块
- 关键字查找:man -k reboot
- 精确查找:man -f reboot
zsh#
通配符#
- ? 单个任意字符
- * 任意几个任意字符
- []、{}
通配符 | 含义 |
---|---|
[123] | 匹配 123 中的任意单一字符 |
[1-3] | 匹配 1-3 中的任意单一字符 |
[0-9a-zA-Z] | 匹配所有数字、大小写字母中的任意单一字符 |
[!(1-3)] | 匹配除 1-3 的任意单一字符,在 bash 中可以不加括号 |
{"a","ab",...} | 匹配 "a" 或 "ab"(或更多) 其一字符串,不能有空格,至少有两个元素 |
任务管理#
- & 命令后用可让其后台执行
- 如何结束?
- ① fg→ctrl + c
- ② kill 任务 id (在执行的时候可以看到)
- ③ pkill 匹配名字 (注意权限过高,可能误删)
- 在输入 kill 时,终端的输入和输出是混在一起的,但其实它们来自不同的文件:#0、#1
- 如何结束?
- ; 放在命令之间,顺序执行
- && 逻辑与,注意短路原则
- || 逻辑或,注意长路原则
- ` ` 命令替换符 (注意:这个键来自于 esc 下面)
- 优先执行其中的命令,再把结果给父命令
- ctrl + z 挂起任务,至少会释放 CPU 资源
- 内存是否释放:得看底层怎么置换,一般是内存不够时置换到交换区
- 和sleep 命令差不多
- bg、fg、jobs:详见《Linux 入门及使用》笔记汇总 ——3.Linux 基础知识 —— 进程相关
重定向#
- [命令] >/>> [文件]
- 注意:>> 将内容追加到文件的末尾,而 > 内容覆盖原文件
- [命令] < [文件]
- 将文件的内容给命令作为输入
- <<
- 用来在输入时指定文件结尾
-
- 这里 EOF 和 000 只是字符串,没有特殊含义
-
- 用来在输入时指定文件结尾
转义符#
- 硬转义
- 单引号包裹 ' '
- 不管什么字符,都是所见即所得
- 【注意】包裹里不允许还有单引号
- 软转义
- 双引号包裹 " "
- 除了特定的 shell 元字符($ 用于变量值替换、` 用于命令替换、\ 用于转义单个字符),其他的都是都是所见即所得
- 反斜杠
- 转义,去除其后紧跟的元字符或通配符的特殊意义
附加知识点#
- 变量调用:$Var 等价于 ${Var}
- 但后者更标准,约定了 $ 的作用范围,可以避免变量名里有特殊字符导致问题的情况
Tips#
- ls --time=[atime、ctime] -l 可以选择显示访问时间 atime 或权限修改时间 ctime,而不是默认显示的修改时间
- 注意:配合 - l 使用
- 对于有空格的文件名,zsh 可能会产生误导,如下:
-
- 这里单引号是为了包住空格,实际上并不存在!
- 若要批量删除,使用 sudo rm -i *\ *
- 这里用 -i 开启了询问模式,因为这个 * 和 \ 令人生怕
-