回到首页

bash中的set命令

set命令控制bash脚本的执行流程,一般来说,bash脚本出现报错不会停止执行,set帮助脚本在适时的地方停止执行给开发者反馈信息。

bash命令执行脚本创建了一个新的shell,bash script.sh使script.sh在一个新的shell中执行,bash默认给定shell环境的各种参数,set可以修改这些参数。如果在命令行下不带任何参数直接运行set,会显示所有的环境变量和shell函数

set -u

遇到不存在的变量报错并停止执行

#!/usr/bin/env bash

set -u
echo $a
echo bar
报错:test.sh: line 4: a: unbound variable,如果没有set -u,该脚本打印一个空行和bar。-u的等价写法是-o nounset

set -e

遇到命令报错(返回值不为0)停止执行

#!/bin/bash

set -e
foo
echo bar
报错:test.sh: line 4: foo: command not found,如果没有set -e,该脚本打印上述报错信息并打印bar。-e的等价写法是-o errexit

set -o pipefail

遇到管道命令中任一环节报错(返回值不为0)停止执行,管道命令的返回值取的是最后一个子命令的返回值,若管道命令中间某个子命令返回1但最后一个子命令返回0,则管道命令返回0,set -e允许脚本继续向下执行

#!/bin/bash

set -e
foo | echo a
echo bar
执行结果
a
test.sh: line 4: foo: command not found
bar
#!/bin/bash

set -eo pipefail
foo | echo a
echo bar
执行结果
a
test.sh: line 4: foo: command not found

set -x

在运行结果之前,先输出执行的那行命令

#!/bin/bash

set -x
a
nvidia-smi
echo bar
执行结果
+ a
test.sh: line 4: a: command not found
+ nvidia-smi
Mon Sep  6 11:19:19 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01    Driver Version: 460.73.01    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla V100-PCIE...  Off  | 00000000:AF:00.0 Off |                    0 |
| N/A   55C    P0    42W / 250W |      0MiB / 32510MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
+ echo bar
bar
-x的等价写法是o xtrace

补充

参考链接:bash之set命令
扩展阅读:4.3.1 The Set Builtin

本文创建于2021年9月6日11点31分,修改于2021年9月6日11点40分