11# set 命令
22
3- ` set ` 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本文介绍它的基本用法,让你可以更安心地使用 Bash 脚本。
3+ ` set ` 命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本章介绍 ` set ` 的基本用法,帮助你写出更安全的 Bash 脚本。
44
55## 简介
66
7- 我们知道,Bash 执行脚本的时候,会创建一个新的 Shell。
7+ 我们知道,Bash 执行脚本时,会创建一个子 Shell。
88
99``` bash
1010$ bash script.sh
1111```
1212
13- 上面代码中,` script.sh ` 是在一个新的 Shell 里面执行。这个 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。
13+ 上面代码中,` script.sh ` 是在一个子 Shell 里面执行。这个子 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。
1414
15- ` set ` 命令用来修改 Shell 环境的运行参数,也就是可以定制环境 。一共有十几个参数可以定制,[ 官方手册] ( https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html ) 有完整清单,本文介绍其中最常用的四个 。
15+ ` set ` 命令用来修改子 Shell 环境的运行参数,即定制环境 。一共有十几个参数可以定制,[ 官方手册] ( https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html ) 有完整清单,本章介绍其中最常用的几个 。
1616
1717顺便提一下,如果命令行下不带任何参数,直接运行` set ` ,会显示所有的环境变量和 Shell 函数。
1818
2222
2323## set -u
2424
25- 执行脚本的时候 ,如果遇到不存在的变量,Bash 默认忽略它。
25+ 执行脚本时 ,如果遇到不存在的变量,Bash 默认忽略它。
2626
2727``` bash
2828#! /usr/bin/env bash
@@ -32,7 +32,7 @@ echo bar
3232```
3333
3434上面代码中,` $a ` 是一个不存在的变量。执行结果如下。
35-
35+
3636``` bash
3737$ bash script.sh
3838
@@ -68,7 +68,7 @@ set -o nounset
6868
6969## set -x
7070
71- 默认情况下,脚本执行后,屏幕只显示运行结果 ,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。
71+ 默认情况下,脚本执行后,只输出运行结果 ,没有其他内容。如果多个命令连续执行,它们的运行结果就会连续输出。有时会分不清,某一段内容是什么命令产生的。
7272
7373` set -x ` 用来在运行结果之前,先输出执行的那一行命令。
7474
@@ -115,7 +115,7 @@ set +x
115115
116116## Bash 的错误处理
117117
118- 如果脚本里面有运行失败的命令(返回值非0 ),Bash 默认会继续执行后面的命令。
118+ 如果脚本里面有运行失败的命令(返回值非 ` 0 ` ),Bash 默认会继续执行后面的命令。
119119
120120``` bash
121121#! /usr/bin/env bash
@@ -269,21 +269,9 @@ script.sh:行4: foo: 未找到命令
269269
270270上面的` -f ` 和` -v ` 参数,可以分别使用` set +f ` 、` set +v ` 关闭。
271271
272- Bash 默认采用 Emacs 模式进行行编辑,可以用下面的命令切换成 Vi 模式。
273-
274- ``` bash
275- $ set -o vi
276- ```
277-
278- 下面的命令可以切换回 Emacs 的行编辑模式。
279-
280- ``` bash
281- $ set -o emacs
282- ```
283-
284272## set 命令总结
285273
286- ` set ` 命令的上面这四个参数 ,一般都放在一起使用。
274+ 上面重点介绍的 ` set ` 命令的四个参数 ,一般都放在一起使用。
287275
288276``` bash
289277# 写法一
@@ -304,9 +292,9 @@ $ bash -euxo pipefail script.sh
304292
305293## shopt 命令
306294
307- ` shopt ` 命令用来调整 Shell 的参数,跟` set ` 命令的作用很类似。主要原因是 ` set ` 是从 Ksh 继承的,属于 POSIX 规范的一部分,而` shopt ` 是 Bash 特有的。
295+ ` shopt ` 命令用来调整 Shell 的参数,跟` set ` 命令的作用很类似。之所以会有这两个类似命令的主要原因是, ` set ` 是从 Ksh 继承的,属于 POSIX 规范的一部分,而` shopt ` 是 Bash 特有的。
308296
309- 接输入 ` shopt ` 可以查看所有参数,以及它们各自打开和关闭的状态。
297+ 直接输入 ` shopt ` 可以查看所有参数,以及它们各自打开和关闭的状态。
310298
311299``` bash
312300$ shopt
0 commit comments