赞
踩
set -e
是 Linux shell 中的一个选项,它的作用是在脚本执行过程中,一旦出现任何命令执行失败(返回非零的退出状态码),脚本就会立即退出。
具体原理如下:
set -e
选项后,shell 会在每个命令执行后检查其退出状态码。这个选项的作用是帮助脚本在出现错误时能够及时停止执行,避免错误的结果被进一步处理或传递。在编写脚本时,可以根据需要选择是否使用set -e
选项。
当一行命令中包含多个子命令时,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
时,要注意在脚本中的每个地方都生效。如果在脚本的某个函数中使用了 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"
结果为:
set +e
来临时禁用 set -e
的效果。在某些情况下,可能需要在特定的代码块中暂时禁用 set -e
,以便处理一些特殊情况。set -e
时,要注意命令执行失败的处理。当命令执行失败时,脚本会立即退出,因此需要确保在脚本中适当处理失败的情况,例如使用条件语句或错误处理机制来处理错误。在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"
运行结果:
在这个示例中,if false
语句中的命令false
会执行失败,但是由于命令的退出状态不为0,if
语句的条件被认为是假,因此执行else
分支,输出"This line will be executed"。然后,继续执行后续的echo
语句,输出"This line will be executed"。
set -e
时,要注意命令的返回值。有些命令的返回值可能不符合预期,例如某些命令即使执行失败也返回0。在这种情况下,set -e
可能无法正常工作,需要额外的处理来确保脚本的正确行为。set -e
只能检测命令的退出状态码,而不能检测其他类型的错误,例如语法错误、文件不存在等。因此,在编写脚本时,还需要考虑其他类型的错误处理机制。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。