Linux set命令用于设置shell。
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置。
set所有的参数说明
参考官网文档set1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19-a 标示已修改的变量,以供输出至环境变量。
-b 使被中止的后台程序立刻回报执行状态。
-C 转向所产生的文件无法覆盖已存在的文件。
-d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e 若指令传回值不等于0,则立即退出shell。
-f 取消使用通配符。
-h 自动记录函数的所在位置。
-H Shell 可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k 指令所给的参数都会被视为此指令的环境变量。
-l 记录for循环的变量名称。
-m 使用监视模式。
-n 只读取指令,而不实际执行。
-p 启动优先顺序模式。
-P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t 执行完随后的指令,即退出shell。
-u 当执行时使用到未定义过的变量,则显示错误信息。
-v 显示shell所读取的输入值。
-x 执行指令后,会先显示该指令及所下的参数。
+<参数> 取消某个set曾启动的参数。
set -o
我们可以看到,在上述参数中,并没有列出 -o
,因为上述参数都是布尔型的参数来确定是否开启相关功能,而 -o
需要提供对应的参数。使用方法如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16set -o <option-name> # 其中 option-name 是系列预定义的命令选项,其中有些命令选项和开关参数是类似的,在此不进行罗列。开关参数未涉及的命令选项如下:
emacs
Use an emacs-style line editing interface (see Command Line Editing). This also affects the editing interface used for read -e.
history
Enable command history, as described in Bash History Facilities. This option is on by default in interactive shells.
ignoreeof
An interactive shell will not exit upon reading EOF.
nolog
Currently ignored.
pipefail
If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands in the pipeline exit successfully. This option is disabled by default.
posix
Change the behavior of Bash where the default operation differs from the POSIX standard to match the standard (see Bash POSIX Mode). This is intended to make Bash behave as a strict superset of that standard.
vi
Use a vi-style line editing interface. This also affects the editing interface used for read -e.
set -e
先说说set -e,这个参数的含义是,当命令发生错误的时候,停止脚本的执行。这是一种替代 && 的相对优雅的解决方案。
比如一个shell种,我们需要有序执行一系列任务,如果其中一个任务失败,则直接推出。起始shell本身是不会监控中间任务的,我们可能会习惯于使用&&来实现这样的功能,比如:1
2#!/bin/bash
echo 111 && rm qzcsbj.txt && echo 2222
但是这样的写法会有几个问题,一方面是代码的可读性会非常差,示例只是简单的任务可能相对还好,但是有些单个任务带着参数可能都要上百个字符串甚至更多,而且一个shell中可能会涉及非常多任务,这样写代码可读性会非常差,使用"\"
进行人工换行,也会极大的增加编码人员的思考了;另一方面这样的写法过程中,是不能进行代码注释的。
而使用 set -e
命令,可以设置脚本遇到错误就退出。1
2
3
4
5
6#!/bin/bash
set -e
echo 111
rm qzcsbj.txt
echo 2222
set -x
说完了-e,继续说说-x。-x参数的作用,是把将要运行的命令用一个+标记之后显示出来。
还是拿上面这个脚本举个例子,这次加上-x:1
2
3
4
5
6 !/bin/bash
set -ex
echo 111
rm qzcsbj.txt
echo 2222
运行后,会用 + 号标记并打印出来每行所执行的具体shell命令,如下:1
2
3
4+ echo 111
111
+ rm qzcsbj.txt
rm: cannot remove 'qzcsbj.txt': No such file or directory
注意第一行和第三行前面那个+,这就是-x参数的作用。