%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
%%
# 帮助手册
> 说明参见
#### man 手册
- `$ man [section] command `: 查看指定命令的手册页(或**指定章节** )
- `$ man -k keyword`: 根据**关键词**搜索手册页,会列出所有相关的手册页。
- `$ man -f name`: 打印**对该命令的简短描述(一行)**,等价于 `whatis` 命令
- `$ whatis [COMMAND...]`: 显示**对该命令的一行 `man` 手册描述**
#### info 文档
- `info command`:查看指定命令的 info 文档
#### help 说明
- `$ help`:概览所有 shell 内置命令
- `$ help command`:查看指定**shell 内置命令**的说明
- `-s`:只显示命令的语法
#### TLDR 手册(开源项目)
- `$ tldr <command>`:查询命令的使用说明
<br><br>
# Linux 命令语法说明
man 手册页中的命令语法格式说明:
![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-F5A201AE6E15D1B64564B0FCF41FAF97.png|534]]
> [!example]
> (1):
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-6DC0D5CB05E8C1BE729DE722D9394082.png|626]]
> (2):
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-08D9C982C89C00604BEBA789B9143443.png|607]]
> (3):
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-69B4BBCAC9C2CA0344F4E6A55693948B.png|632]]
>
<br><br><br>
# 命令列表
命令列表:在单行中指定要**依次运行**的一系列命令,各个命令之间以**分号`;`分隔**。
```shell
true; echo "Hello world"
```
<br>
# 命令编组 🐢
"**命令编组**"(`grouping`) 用于指示 **"==创建一个新的子 shell== 并在该==子 shell 中执行括号内命令=="**:
- 语法: `(commands)`,即圆括号包围一组命令
- 圆括号中的命令将在**新创建的子 shell 中依次执行**;
- 子 shell 在命令执行完成后会**自动退出**。
> [!NOTE] 命令编组的主要目的:**==环境隔离==**
>
> - 括号内的命令在一个新的子 shell 中执行,**任何在括号内进行的环境变量修改、目录切换等操作不会影响当前 shell**。
> >
> - 适用于 "**需要临时改变环境变量或目录的场景**"。
```shell
# 示例: 利用命令编组创建一个子shell, 并在子shell中切换目录, 修改环境变量
MYVAR="Hello"
(cd ../mydir; export MYVAR="World"; pwd; echo $MYVAR)
pwd; echo $MYVAR
```
### 命令编组的用途
![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-命令行基本使用.assets/IMG-Linux-命令行基本使用-5A4B013986EAC11E416C7381292A02CE.png|435]]
<br>
# 条件执行 🐢
- `command1 && command2`: 在**前一条命令==成功执行==的情况下** 执行第二条命令
- `command1 || command2`: 在**前一条命令==没有成功执行==时**执行第二条命令
<br><br>
# 命令替换 🐢
![[02-开发笔记/11-Linux/shell 相关/shell 脚本#命令替换|命令替换]]
# 进程替换 🐢
进程替换:**将一个命令的==标准输入或输出==与一个 "==伪文件==" (临时文件)关联**,同时 "**进程替换**" 语法本身会被替换为该 "**伪文件**",因而可用在任何 **"==文件==" 作为参数或输入的位置**。
- **输出**进程替换:`<(command)`—— **将 `command` 的==标准输出== 重定向到伪文件**,同时**将指令 `<(command)` 替换为该伪文件**。
- **输入**进程替换:`>(command)`—— **将 `command` 的==标准输入== 重定向到伪文件**,同时**将指令 `>(command)` 替换为该伪文件**。
参见[[02-开发笔记/11-Linux/shell 相关/shell-输入输出与重定向#进程替换|输入输出与重定向-进程替换]]
<br>
# 将标准输入作为参数传递给另一命令——`xargs` 命令
`xargs` 工具**将==来自其 `stdin` 的输入==作为==参数==传递给另一个命令**。
`xargs [options] [command [initial-arguments]]`:
- `-r`:若 `xargs` 没有输入则不运行命令
```shell
# 删除当前目录下所有文件
ls | xargs rm
# 递归删除当前目录及其子目录中的所有`.tmp`文件
find . -name "*.tmp" | xargs rm
# 统计指定目录下所有`.c`和`.h`文件中的代码行数
find /path -name '*.c' -p -name '*.h' | xargs wc -l
```
<br><br>
# 别名 🐢
#### 查看别名
- `$ alias [name]` 🐢:查看**所有别名**或**指定别名**的定义
#### 创建别名
- `$ alias name='command'` 🐢 : 为指定**命令或命令序列**创建别名
> [!NOTE]
>
> - 在 **shell 或 shell 脚本**中定义的别名仅在**其被定义的 shell 进程中**有效。
> - 在**环境变量**中定义的别名将在任何地方都有效。
>
> 创建永久别名:为了使别名在**每次启动 shel l 时都可用**,可以将别名添加到 shell 的配置文件 `~/.bashrc` 中:
>
> ```shell
> # 示例:
> echo "alias ll='ls -l'" >> ~/. bashrc
> echo "alias la='ls -la'" >> ~/. bashrc
> echo "alias gs='git status'" >> ~/. bashrc
> ```
>
#### 删除别名
- `$ unalias name` 🐢:删除指定别名
<br>
# 标准通配符

```shell
ls f?ll # 匹配任意单个字符
ls f*ll # 匹配0个或多个字符
ls f[ai]ll # 匹配a或i
ls f[a-i]ll # 匹配字母范围
ls f[!a]ll # 排除字符
```
<br>
# 花括号展开
当在一个 **"字符串" 中包含花括号 `{}`** 时,**花括号内的内容(以`,`分隔)将会==自动展开==**。
```shell
convert image.{png,jpg}
# Will expand to
convert image.png image.jpg
cp /path/to/project/{foo,bar,baz}.sh /newpath
# Will expand to
cp /path/to/project/foo.sh /path/to/project/bar.sh /path/to/project/baz.sh /newpath
# Globbing techniques can also be combined
mv *{.py,.sh} folder
# Will move all *.py and *.sh files
```
<br>
# 单引号与双引号
- 单引号 `'` 括起来的字符串只作为 "**==字符串字面量==**",不会进行 "**变量引用**";
- 双引号 `"` 括起来的字符串中,`
会被解释为 "**变量引用**"
```shell
foo=bar
echo '$foo' # print $foo
echo "$foo" # print bar
```
<br>
# 一些快捷用法
- `cd -`:返回上一个目录
- `!!`:重复执行上一条指令
- `$_`:表示上一个命令的**最后一项参数**,可借此重复上一 "路径"、"文件名" 等。
<br><br>
# shell 相关
#### 查看 shell 选项
- `$ set -o`:以**容易阅读的方式**显示所有 shell 选项的当前状态。
- `$ set +o`:以**紧凑的方式**显示所有 shell 选项的当前状态
#### 设置/复位 shell 选项
- `$ set -o <option>`: 打开/设置指定 shell 选项
- `$ set +o <option>`: 取消/复位指定 shell 选项
<br><br>
# 变量相关
> [!NOTE]
> - 当需要**使用**环境变量的**值**,"**引用**"环境变量时,需要在环境变量名前加`
。
> - 例如 `echo $var`
> - `printvar` 命令除外
>
> - 当需要**操作**环境变量时,不需要加`
。
> - 例如`export`,`unset` ;
#### 查看所有环境变量
- `$ printenv` | `$ env` : 查看**所有环境变量
#### 查看指定变量
- `$ printenv var` :查看**指定 "环境变量" 的值** (变量名前**不需要**带有`
)
- `$ echo $var`: 查看**指定变量(环境变量或 shell 变量)的值** (变量名前需要带有 `
)
```shell
# 示例: 查看环境变量HOME
printenv HOME
echo $HOME
```
#### 查看 shell 变量和函数
> 所有通过 env 命令或 printenv 命令能看到的环境变量也会显示在 `set` 的输出中
- `$ set` 🐢 :显示**当前 shell 进程**中的**所有 shell 变量**(包括环境变量、用户自定义的局部变量)和**shell 函数**,输出结果按字母序排序
#### 定义 shell 变量
`$ variable=value` (注:**等号两边不能有空格**)
> 示例:`$ PATH=$PATH:/home/ddd`,将新的路径"追加"到现有环境变量中。
>
> 注:如果希望子进程该环境变量,则务必确保将修改后的 PATH 环境变量通过`export` 导出。
#### 将 shell 变量导出为环境变量
- `$ export var` :导出某个已定义的 shell 变量为 "环境变量"
- `$ export var=value` : 定义并导出为环境变量
> [!NOTE] 如果 value 字符串包含空格,则必须用单引号或双引号来界定起止。
>
> 示例:`$ my_var="Hello World"`
>
#### 删除变量
`$ unset var` 删除某个变量
#### bash shell 特殊变量
![[02-开发笔记/11-Linux/shell 相关/shell 变量#bash shell 特殊变量|shell 变量]]
# 历史命令 🐢
- `$ ![OPTION]`:**事件提示符**
- `$ !<N>` :**执行 `history` 中序号为 `N` 的历史指令**
- `$ !-<N>`:**执行`history` 中==倒数==第 `N` 个命令**
- `$!!` | `$ !-1`:执行上一条命令(`!!` 是 `!-1` 的别名)
- `$ history [num]` **查看最近使用过的历史命令**(通常默认保存最近 1000 条,保存于在`.bash_history` 文件中)
- `-a`:强制将命令历史记录写入`.bash_history` 文件;
- 默认情况下,在 CLI 会话期间,bash 命令的历史记录被保存在内存中。当 shell 退出时才被写入历史文件。
- `-c`:**清空**当前用户在本机上的历史指令记录
- `[num]`:指定 `num` 时,显示 "**最近使用的 `num` 条指令**"
<br><br>
# 参考资料
# Footnotes