File tree 4 files changed +58
-7
lines changed 4 files changed +58
-7
lines changed Original file line number Diff line number Diff line change 13
13
- loop.md : 循环
14
14
- function.md : 函数
15
15
- array.md : 数组
16
- - set.md : set 命令
16
+ - set.md : set 命令,shopt 命令
17
17
- debug.md : 脚本除错
18
18
- mktemp.md : mktemp 命令,trap 命令
19
19
- startup.md : 启动环境
Original file line number Diff line number Diff line change @@ -43,7 +43,7 @@ cd $dir_name && rm *
43
43
44
44
## ` bash ` 的` -x ` 参数
45
45
46
- ` bash ` 的` -x ` 参数可以在执行每一行命令之前,打印该命令。这样就不用自己输出执行的命令, 一旦出错,比较容易追查 。
46
+ ` bash ` 的` -x ` 参数可以在执行每一行命令之前,打印该命令。一旦出错,这样就比较容易追查 。
47
47
48
48
下面是一个脚本` script.sh ` 。
49
49
Original file line number Diff line number Diff line change 1
- # set 命令
1
+ # set 命令,shopt 命令
2
2
3
3
` set ` 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本章介绍` set ` 的基本用法,帮助你写出更安全的 Bash 脚本。
4
4
@@ -259,6 +259,57 @@ script.sh:行4: foo: 未找到命令
259
259
260
260
可以看到,` echo bar ` 没有执行。
261
261
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
+
262
313
## 其他参数
263
314
264
315
` set ` 命令还有一些其他参数。
@@ -271,14 +322,14 @@ script.sh:行4: foo: 未找到命令
271
322
272
323
## set 命令总结
273
324
274
- 上面重点介绍的` set ` 命令的四个参数 ,一般都放在一起使用。
325
+ 上面重点介绍的` set ` 命令的几个参数 ,一般都放在一起使用。
275
326
276
327
``` bash
277
328
# 写法一
278
- set -euxo pipefail
329
+ set -Eeuxo pipefail
279
330
280
331
# 写法二
281
- set -eux
332
+ set -Eeux
282
333
set -o pipefail
283
334
```
284
335
Original file line number Diff line number Diff line change @@ -90,7 +90,7 @@ $ bash --rcfile testrc
90
90
91
91
- ` -n ` :不运行脚本,只检查是否有语法错误。
92
92
- ` -v ` :输出每一行语句运行结果前,会先输出该行语句。
93
- - ` -x ` :每一个命令处理完以后 ,先输出该命令,再进行下一个命令的处理 。
93
+ - ` -x ` :每一个命令处理之前 ,先输出该命令,再执行该命令 。
94
94
95
95
``` bash
96
96
$ bash -n scriptname
You can’t perform that action at this time.
0 commit comments