Skip to content

Commit 74efe43

Browse files
committed
docs(set): edit set -E
1 parent 745d28e commit 74efe43

File tree

4 files changed

+58
-7
lines changed

4 files changed

+58
-7
lines changed

chapters.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
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: 启动环境

docs/debug.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

docs/set.md

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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
282333
set -o pipefail
283334
```
284335

docs/startup.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)