为什么子 shell 中的 stderr 没有被抑制或重定向?

Zhr*_*hro 5 bash stderr subshell

我知道子 shell 的标准输出从调用者的输出中被抑制:

a=$(echo 123)
echo a:$a
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,输出:

a:123
Run Code Online (Sandbox Code Playgroud)

但是为什么 stderr 不在子 shell 中被抑制呢?

a=$(>&2 echo 123)
Run Code Online (Sandbox Code Playgroud)

预期输出:

(没有什么)

实际输出:

123
Run Code Online (Sandbox Code Playgroud)

这是一个测试,其中 stderr 应重定向到 stdout 并捕获到变量a

a=$(>&2 echo 123 2>&1)
echo a:$a
Run Code Online (Sandbox Code Playgroud)

预期输出:

a:123
Run Code Online (Sandbox Code Playgroud)

实际输出:

123
a:
Run Code Online (Sandbox Code Playgroud)

che*_*ner 4

输出没有被抑制;它正在被捕获(echo foo)这就是普通子 shell和命令替换 之间的区别a=$(echo foo)。此外,命令替换不捕获标准错误,仅捕获标准输出。