set -e基本原理
set -e
是 Linux shell 中的一个选项,它的作用是在脚本执行过程中,一旦出现任何命令执行失败(返回非零的退出状态码),脚本就会立即退出。
具体原理如下:
- 当设置了
set -e
选项后,shell 会在每个命令执行后检查其退出状态码。 - 如果命令的退出状态码为非零,表示命令执行失败,shell 会立即退出脚本,并返回该非零状态码。
- 如果命令的退出状态码为零,表示命令执行成功,shell 会继续执行下一个命令。
这个选项的作用是帮助脚本在出现错误时能够及时停止执行,避免错误的结果被进一步处理或传递。在编写脚本时,可以根据需要选择是否使用set -e
选项。
使用set -e,当一行命令中包含多个子命令时,即使某个子命令返回值不为0,但最终那一行命令的返回值为0,脚本也不会报错退出
当一行命令中包含多个子命令时,set -e选项只会检查整行命令的退出状态。如果整行命令的退出状态为非零,表示整行命令执行失败,shell会立即退出脚本
使用|| true屏蔽前面子命令的返回值
为了屏蔽掉前面子命令的错误,我们可以使用|| true
。||
是逻辑或运算符,它的作用是在前一个命令执行失败时执行后面的命令。而true
是一个命令,它总是返回真(即退出状态为0),所以无论前面子命令是否执行成功,|| true
都会使整个逻辑表达式返回真,从而避免了set -e
选项导致的脚本退出。
举个例子,假设有一行命令如下:
command1 || true
如果设置了 set -e
,并且 command1
的返回值不为0,那么整个表达式的返回值为0,脚本不会退出。
因此,使用 || true
可以屏蔽某个子命令的返回值,即使设置了 set -e
,子命令返回值不为0也不会导致脚本退出。
再举个真实一点的例子:
#!/bin/bash
set -e
echo "This line will be executed"
false
echo "This line will be executed"
运行结果:
但是如果用|| true
就能屏蔽前面子命令的返回值:
#!/bin/bash
set -e
echo "This line will be executed"
false || true
echo "This line will be executed"
运行结果:
set -e命令的其他注意事项
除了上面提到的使用 set -e
的技巧外,还有一些其他的注意事项:
1. 使用 set -e 时,要注意在脚本中的每个地方都生效。如果在脚本的某个函数中使用了 set -e,那么只有在该函数被调用后才会生效,不调用不会生效。在函数中的set -e被调用后,出了函数外也会开始受影响。
例如:
#!/bin/bash
function foo() {
set -e
echo "Inside foo"
# false # 这个命令会执行失败
echo "After false"
}
function bar() {
echo "Inside bar"
foo
# false
echo "After foo"
}
echo "Before bar"
bar
false
echo "After bar"
结果为:
2. 可以使用 set +e 来临时禁用 set -e 的效果。在某些情况下,可能需要在特定的代码块中暂时禁用 set -e,以便处理一些特殊情况。
3. 使用 set -e 时,要注意命令执行失败的处理。当命令执行失败时,脚本会立即退出,因此需要确保在脚本中适当处理失败的情况,例如使用条件语句或错误处理机制来处理错误。
用if语句来判断命令执行返回值,用if语句判断,命令返回值不为0也不会直接退出
在if
语句中,命令的退出状态会被用作条件判断。如果命令的退出状态为0(即命令执行成功),if
语句的条件会被认为是真,执行then
分支;如果命令的退出状态不为0(即命令执行失败),if
语句的条件会被认为是假,执行else
分支。
以下是一个示例,演示了在if
语句中判断命令的退出状态:
#!/bin/bash
set -e
if false; then
echo "This line will not be executed"
else
echo "This line will be executed"
fi
echo "This line will be executed"
运行结果:
文章来源:https://www.toymoban.com/news/detail-834679.html
在这个示例中,if false
语句中的命令false
会执行失败,但是由于命令的退出状态不为0,if
语句的条件被认为是假,因此执行else
分支,输出"This line will be executed"。然后,继续执行后续的echo
语句,输出"This line will be executed"。文章来源地址https://www.toymoban.com/news/detail-834679.html
4. 在使用 set -e 时,要注意命令的返回值。有些命令的返回值可能不符合预期,例如某些命令即使执行失败也返回0。在这种情况下,set -e 可能无法正常工作,需要额外的处理来确保脚本的正确行为。
5. 要注意 set -e 只能检测命令的退出状态码,而不能检测其他类型的错误,例如语法错误、文件不存在等。因此,在编写脚本时,还需要考虑其他类型的错误处理机制。
到了这里,关于Linux shell脚本set -e原理(set -o errexit 命令出错退出)(|| true屏蔽前面子命令返回值)(用if判断即使命令返回值不为零也不会退出)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!