据我了解,以下 bash 脚本应该在第二条语句之后中止,因为用于初始化变量
a
的命令失败了:
set -eu -o pipefail
read a <<< $(false)
echo Hi there: '>'$a'<'
相反,该变量被分配了一个空字符串,并且脚本继续打印:
Hi there: ><
。
如何可靠地(区分实际失败和空输出)检测用于此类“此处字符串”分配的命令的失败?
由于 Bash 处理命令替换中的错误的方式,您的脚本不会在第二行之后停止。当你使用 $(...) 时,如果里面的命令失败,Bash 不会退出,即使使用 set -e 也是如此。因此,当 false 在 $(false) 内运行时,它会失败,但脚本会继续运行。
阅读<<< $(false) line ends up assigning an empty string to a because $(false) produces nothing. That's why your script prints Hi there: ><, showing that a is empty.
您需要一种方法来捕获 $(...) 内命令的失败。由于 set -e 无法捕获它,因此您必须自己检查命令的退出状态。一种方法是先运行命令,检查它是否成功,然后分配其输出。
因此,为了可靠地检测命令是否失败或仅返回空字符串,您应该将命令执行与分配分开。如果命令失败,您的脚本可以退出或正确处理错误。