如果在shell 脚本中命令替换命令失败,变量会被分配为空吗?

Will variable be assigned to empty if the command for command substitution failed in shell scriping?

a=whatever
f(){return 1}
echo $a # this gives whatever
a=$(f)
echo $a # now a is empty

是否因为命令返回非零,所以命令替换失败,因此a设置为空?这是定义明确的行为吗?到处都找不到。你能告诉我描述它的文档吗?

我试图从文件中 grep 一些东西并将结果分配给变量。所以我做了a=$(grep pattern file_not_exist)。然后我看到 grep 抱怨文件不存在。我想知道为什么这个投诉消息没有分配给变量而不是被打印出来?是因为stdout和stderr吗?

不是,不是命令失败导致a为空

该命令没有产生任何输出数据,因此 a 中没有要捕获的数据。

修改函数为:

f(){ echo Hello; return 1; }

现在运行命令替换。您会发现 a 包含 Hello。如果在赋值后立即检查 $?,它包含 1,函数返回的状态。退出状态和命令输出是分开的。

文档在 Command Substitution 的 GNU Bash 手册中。