File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1313- loop.md : 循环
1414- function.md : 函数
1515- array.md : 数组
16- - set.md : set 命令
16+ - set.md : set 命令,shopt 命令
1717- debug.md : 脚本除错
1818- mktemp.md : mktemp 命令,trap 命令
1919- startup.md : 启动环境
Original file line number Diff line number Diff line change @@ -43,7 +43,7 @@ cd $dir_name && rm *
4343
4444## ` bash ` 的` -x ` 参数
4545
46- ` bash ` 的` -x ` 参数可以在执行每一行命令之前,打印该命令。这样就不用自己输出执行的命令, 一旦出错,比较容易追查 。
46+ ` bash ` 的` -x ` 参数可以在执行每一行命令之前,打印该命令。一旦出错,这样就比较容易追查 。
4747
4848下面是一个脚本` script.sh ` 。
4949
Original file line number Diff line number Diff line change 1- # set 命令
1+ # set 命令,shopt 命令
22
33` set ` 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本章介绍` set ` 的基本用法,帮助你写出更安全的 Bash 脚本。
44
@@ -259,6 +259,57 @@ script.sh:行4: foo: 未找到命令
259259
260260可以看到,` echo bar ` 没有执行。
261261
262+ ## set -E
263+
264+ 设置` -e ` 参数,会导致` trap ` 命令失效(参考《trap 命令》一章),` -E ` 参数可以纠正这个行为。
265+
266+ ``` bash
267+ #! /bin/bash
268+ set -euo pipefail
269+
270+ trap " echo ERR trap fired!" ERR
271+
272+ myfunc ()
273+ {
274+ # 'foo' 是一个不存在的命令
275+ foo
276+ }
277+
278+ myfunc
279+ ```
280+
281+ 上面的脚本,` myfunc ` 函数调用了一个不存在的命令` foo ` ,导致执行这个函数会报错。
282+
283+ ``` bash
284+ $ bash test.sh
285+ test.sh:行9: foo:未找到命令
286+ ```
287+
288+ 但是,由于设置了` set -e ` ,脚本报错后并没有被` trap ` 命令捕获,需要加上` -E ` 参数才可以。
289+
290+ ``` bash
291+ #! /bin/bash
292+ set -Eeuo pipefail
293+
294+ trap " echo ERR trap fired!" ERR
295+
296+ myfunc ()
297+ {
298+ # 'foo' 是一个不存在的命令
299+ foo
300+ }
301+
302+ myfunc
303+ ```
304+
305+ 执行上面这个脚本,就可以看到` trap ` 命令生效了。
306+
307+ ``` bash
308+ $ bash test.sh
309+ test.sh:行9: foo:未找到命令
310+ ERR trap fired!
311+ ```
312+
262313## 其他参数
263314
264315` set ` 命令还有一些其他参数。
@@ -271,14 +322,14 @@ script.sh:行4: foo: 未找到命令
271322
272323## set 命令总结
273324
274- 上面重点介绍的` set ` 命令的四个参数 ,一般都放在一起使用。
325+ 上面重点介绍的` set ` 命令的几个参数 ,一般都放在一起使用。
275326
276327``` bash
277328# 写法一
278- set -euxo pipefail
329+ set -Eeuxo pipefail
279330
280331# 写法二
281- set -eux
332+ set -Eeux
282333set -o pipefail
283334```
284335
Original file line number Diff line number Diff line change @@ -90,7 +90,7 @@ $ bash --rcfile testrc
9090
9191- ` -n ` :不运行脚本,只检查是否有语法错误。
9292- ` -v ` :输出每一行语句运行结果前,会先输出该行语句。
93- - ` -x ` :每一个命令处理完以后 ,先输出该命令,再进行下一个命令的处理 。
93+ - ` -x ` :每一个命令处理之前 ,先输出该命令,再执行该命令 。
9494
9595``` bash
9696$ bash -n scriptname
You can’t perform that action at this time.
0 commit comments