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

时间:2017-11-08 14:50:03

标签: bash stderr subshell

我知道子shell的调用符号输出被抑制了:

a=$(echo 123)
echo a:$a

按预期输出:

a:123

但是为什么stnr并没有被压缩,因为它在子壳中?

a=$(>&2 echo 123)

预期产出:

(无)

实际输出:

123

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

a=$(>&2 echo 123 2>&1)
echo a:$a

预期产出:

a:123

实际输出:

123
a:

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

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

a=$(>&2 echo 123 2>&1)

没有。

  1. 首先,您将fd1重定向到当前正在使用的fd2:>&2 - 现在,stdout指向stderr。
  2. 然后,您将fd2重定向到fd1当前正在使用的内容:2>&1 - 现在,stderr指向stderr。
  3. 如果您希望stderr指向stdout,则无法首先重定向stdout。删除>&2