124 lines
3.0 KiB
Markdown
124 lines
3.0 KiB
Markdown
|
||
---
|
||
#领域/Linux
|
||
|
||
#复盘/0
|
||
|
||
## 一句话描述
|
||
|
||
[____set退出脚本___]
|
||
|
||
---
|
||
|
||
## 核心规范
|
||
|
||
>空想不如行动,积累胜于苛求。
|
||
>实践 > 沉淀 > 完美主义
|
||
|
||
实践不是盲目行动,而是带着“小目标、可验证“的方向试错,实践后必须沉淀(比如记录问题、总结规律),否则就是低水平重复。
|
||
|
||
实践大于沉淀,沉淀大于完美;完美是沉淀的终局方向,沉淀是实践的复盘产物;分域施策,避坑落地,始于行动,终于迭代。
|
||
|
||
---
|
||
|
||
## 三省沉淀法
|
||
|
||
- 达成了[__脚本基础异常时退出执行______]目标
|
||
- 遇到了[__并未覆盖所有异常______]问题
|
||
- 下次改进[__整理手动处理规范______]
|
||
|
||
## 个人理解
|
||
|
||
[__set -euo pipefail 标准用法,覆盖未定义、遇到错误,并接收第一个失败错误码______]
|
||
|
||
## 实践计划
|
||
|
||
#状态/待实践
|
||
|
||
1. [__整理手动处理异常规范______]
|
||
2. [________]
|
||
3. [________]
|
||
|
||
---
|
||
|
||
## 核心定义
|
||
|
||
1. set -u 检测到 [__未定义变量______] 时退出脚本
|
||
2. set -e 检测到 [____遇到错误____] 时退出脚本
|
||
3. set -o pipefail 接收 [____第一个失败命令的错误码____]
|
||
|
||
生产环境标配:
|
||
开启严格模式:覆盖变量、命令、管道三类错误检测
|
||
|
||
set -euo pipefail
|
||
|
||
### 示例
|
||
|
||
#### ✅ 示例一:set -u 未定义变量
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# 未开启set -u:未定义变量被当作空值
|
||
echo "未开启-u:$undefined_var" # 输出"未开启-u:",脚本继续
|
||
echo "脚本执行到这里(未开启-u)"
|
||
|
||
# 开启set -u:未定义变量直接报错
|
||
set -u
|
||
echo "开启-u:$undefined_var" # 报错:line 8: undefined_var: unbound variable
|
||
echo "脚本不会执行到这里(开启-u)" # 不会执行
|
||
```
|
||
|
||
#### ✅ 示例二:set -e 遇到错误
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# 未开启set -e:命令失败仍继续执行
|
||
ls /不存在的目录 # 报错:No such file or directory
|
||
echo "脚本执行到这里(未开启-e)" # 仍会执行
|
||
|
||
# 开启set -e:命令失败直接退出
|
||
set -e
|
||
ls /不存在的目录 # 报错后脚本退出
|
||
echo "脚本不会执行到这里(开启-e)" # 不会执行
|
||
```
|
||
|
||
### 避坑点
|
||
|
||
⚠️ 避坑点1:set -e 部分场景失效
|
||
核心问题:set -e 不会捕获 if cmd ; then、cmd || true、未开pipefail的错误
|
||
解决方案:✅ 手动检查配合,set -o pipefail
|
||
|
||
```bash
|
||
if ls /不存在的目录; then
|
||
echo "成功"
|
||
else
|
||
err_code=$?
|
||
echo "失败,错误码:$err_code"
|
||
exit $err_code
|
||
fi
|
||
```
|
||
|
||
```bash
|
||
ls /不存在的目录 | echo # 这里管道结果为 0 不会报错
|
||
|
||
# 需要配合 -o pipefail 来获取管道第一个错误来退出
|
||
```
|
||
|
||
|
||
⚠️ 避坑点2:set -u 对参数变量误判
|
||
核心问题:set -u 下, bash特性不会对 `$*`、`$@` 报错
|
||
解决方案:✅ 使用参数前先判断数量
|
||
|
||
```bash
|
||
if [ $# -lt 1 ]; then
|
||
echo "请传入参数!"
|
||
exit 1
|
||
fi
|
||
echo "第一个参数:$1"
|
||
```
|
||
|
||
⚠️ 避坑点3:pipefail 不直接导致脚本退出
|
||
核心问题:pipefail 仅修改管道错误码,需搭配 set -e
|
||
解决方案:✅ pipefail 必须搭配 set -e
|
||
|