0%

高级设置-set

高级设置-set

set是bash的内建命令。它的作用是设置bash的一些特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@vm-101 ~]# compgen -b | grep set
set
typeset
unset
[root@vm-101 ~]# set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off

更详细的在: https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

set -x

类似调试作用。写一个复杂点的脚本时还是很有用的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@vm-101 ~]# cat set.sh
#!/bin/bash

# 注释是个好习惯

set -x

echo '1111'
b=2222
echo $b

exit 0



[root@vm-101 ~]# bash set.sh
+ echo 1111 # 没执行一步都显示出来,方便追踪
1111
+ b=2222
+ echo 2222
2222

set -e

如果脚本在一个地方报错,整个脚本就直接退出。

好处就是在服务器上执行一些很重要的操作时,可以用这种方式,在一定程度上保护系统的安全。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@vm-101 ~]# cat set.sh
#!/bin/bash

# 注释是个好习惯

cd asdf # asdf 这个路径是不存在的,肯定报错。

set -e

echo "1111111111"
cd asdf # 第二次测试的时候把这行注释掉
echo "2222222222"

set +e

cd asdf
echo "3333333333"

exit 0



[root@vm-101 ~]# bash set.sh
set.sh: 第 5 行:cd: asdf: 没有那个文件或目录
1111111111
set.sh: 第 10 行:cd: asdf: 没有那个文件或目录

[root@vm-101 ~]# bash set.sh # 这时要注释掉`cd asdf`那行
set.sh: 第 5 行:cd: asdf: 没有那个文件或目录
1111111111
2222222222
set.sh: 第 15 行:cd: asdf: 没有那个文件或目录
3333333333

set -o

还记得前面提到过的吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@vm-101 ~]# set -o
allexport off # 变量和函数在创建和修改的时候,都会自动的export子进程的环境中。快捷开关 -a
braceexpand on # 打开{}扩展。默认打开的。 快捷开关 -B
emacs on # 命令行默认编辑器设置为emacs。
errexit off # 就是上面提到的 set -e
errtrace off # 子进程,命令替换,函数中,不会继承trap ERROR。快捷开关 -E
functrace off # 和上面差不多。只不过是trap DEBUG and RETURN。快捷开关 -T
hashall on # 自动记录函数的所在位置。默认开启。快捷开关 -h
histexpand on # 打开历史命令扩展。 !和!!.默认开启。快捷开关 -H
history on # 打开命令行历史,默认开启
ignoreeof off # 禁止用EOF(Ctrl+D)键退出shell
interactive-comments on # 交互式shell中,把#符后面的文本作为注释
keyword off # 将关键字参数放到命令的环境中。快捷开关 -k
monitor on # 设置作业控制。快捷开关 -m
noclobber off # 禁止重定向覆盖文件,快捷开关 -C
noexec off # 读命令,但不执行。用来检查脚本的语法。交互式运行时不开启。快捷开关 -n
noglob off # 禁止用路径名扩展。即关闭通配符。快捷开关 -d
nolog off # 弃用了。
notify off # 后台作业完成时通知用户。快捷开关 -b
nounset off # 扩展一个未设置的变量时显示一个错误信息。快捷开关 -u
onecmd off # 在读取和执行命令后退出。 快捷开关 -t
physical off # 设置时,在键入cd或pwd禁止符号链接。用物理目录代替。快捷开关 -P
pipefail off # 如果管道中的所有语句都成功返回,就返回0;否则返回最后一个语句的返回值。默认是关闭的。
posix off # 开启POSIX模式
privileged off # 设置后,shell不读取.profile或ENV文件,且不从环境继承shell函数,将自动为setuid脚本开启特权。 快捷开关 -p
verbose off # 调试打开verbose模式。 快捷开关 -v
vi off # 使用vi内置编辑器进行命令行编辑器
xtrace off # 就是上面的set -x。 快捷开关 -x

Bash POSIX Mode详细说明