set命令控制bash脚本的执行流程,一般来说,bash脚本出现报错不会停止执行,set帮助脚本在适时的地方停止执行给开发者反馈信息。
bash命令执行脚本创建了一个新的shell,bash script.sh使script.sh在一个新的shell中执行,bash默认给定shell环境的各种参数,set可以修改这些参数。如果在命令行下不带任何参数直接运行set,会显示所有的环境变量和shell函数
遇到不存在的变量报错并停止执行
#!/usr/bin/env bash set -u echo $a echo bar报错:
test.sh: line 4: a: unbound variable,如果没有set -u,该脚本打印一个空行和bar。-u的等价写法是-o nounset。
遇到命令报错(返回值不为0)停止执行
#!/bin/bash set -e foo echo bar报错:
test.sh: line 4: foo: command not found,如果没有set -e,该脚本打印上述报错信息并打印bar。-e的等价写法是-o errexit
遇到管道命令中任一环节报错(返回值不为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
在运行结果之前,先输出执行的那行命令
#!/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
command || exit 1意即command执行错误退出脚本,command || true保证command在set -e环境下遇错继续向下执行,command1 && command2意即command1执行成功方可执行command2。set -e配置打开环境参数选项后,set +e关闭环境参数选项bash -x script.sh与在script.sh开头set -x效果一致参考链接:bash之set命令
扩展阅读:4.3.1 The Set Builtin