重要
最重要的事:
1.简介
set 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。此处记录基本用法。
2.使用
set命令用来修改 Shell 环境的运行参数,也就是定制环境。
顺便提一下,如果命令行下不带任何参数,直接运行set,会显示所有的环境变量和 Shell 函数
常用的四个命令如下
- u, 忽略空变量
- x, 调试 结果前打印命令
- e, 发生错误,立即终止
- o pipefail, 管道子命令发生错误,立即终止
2.1 忽略不存在变量
忽略 执行脚本 中 不存在的变量。
| |
等同于
| |
2.2 在打印结果之前,先打印命令。
在运行结果之前,先输出执行的命令。
| |
等同于
| |
2.3 错误处理
Bash 命令执行失败,默认会继续执行后面的命令。
通过下面写法,当command有非零返回值,脚本就会停止执行。防止错误累积
| |
退出时,执行额外操作
| |
等同于
| |
等同于
| |
2.4 命令依赖
command1执行成功,再执行command2。
| |
2.5 发生错误,立即终止
脚本只要发生错误,就终止执行。但对
|管道失效,具体原因看 2.6 小节
| |
等同于
| |
脚本后续命令,非空返回为执行成功。则需要临时关闭set -e,来让命令正常执行
| |
也可以通过command || true的方式解决
| |
2.6 子命令失败,整个管道命令就失败,脚本就会终止执行。
管道命令,就是多个子命令通过管道运算符|组合成为一个大的命令。Bash会把最后一个子命令的返回值,作为整个命令的返回值。
也就是说,只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,set -e 就失效了。
例如
| |
改为如下写法,解决管道问题
| |
总结
上面参数总会一起使用
- u, 忽略空变量
- x, 调试 结果前打印命令
- e, 发生错误,立即终止
- o pipefail, 管道子命令发生错误,立即终止
比如
| |
等同于
| |
等同于
| |