如何捕获“here-string”命令的失败?

问题描述 投票:0回答:1

据我了解,以下 bash 脚本应该在第二条语句之后中止,因为用于初始化变量

a
的命令失败了:

set -eu -o pipefail

read a <<< $(false)

echo Hi there: '>'$a'<'

相反,该变量被分配了一个空字符串,并且脚本继续打印:

Hi there: ><

如何可靠地(区分实际失败和空输出)检测用于此类“此处字符串”分配的命令的失败?

bash error-detection herestring
1个回答
-1
投票

由于 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 无法捕获它,因此您必须自己检查命令的退出状态。一种方法是先运行命令,检查它是否成功,然后分配其输出。

因此,为了可靠地检测命令是否失败或仅返回空字符串,您应该将命令执行与分配分开。如果命令失败,您的脚本可以退出或正确处理错误。

© www.soinside.com 2019 - 2024. All rights reserved.