为什么 Bash 在将 stdout 重定向到 stderr 两次时输出两行(`>&2` 和 `>/dev/stderr`)?

为什么 Bash 在将 stdout 重定向到 stderr 两次时输出两行(`>&2` 和 `>/dev/stderr`)?

为什么以下输出重定向会导致打印两行?

>&2stdout 复制到 stderr 并将>/dev/stderrstdout 重定向到 stderr。

我期望只有一个输出行,因为echo foo输出被重定向到 stderr。

为什么我看不到:echo foo >/dev/stderr 2>&1和的两条输出行echo foo >/dev/stdout 2>&1

➜  app git:(python3.10-pipeline) ✗ echo foo >/dev/stderr >&2
foo
foo
➜  app git:(python3.10-pipeline) ✗ echo foo >/dev/stdout >&2
foo
foo

答案1

bashshell 中,重定向同一个流两次将导致流的内容被重定向到最后的(最右边)目的地。确实,如果您向bashshell 提供所显示的命令,则每个命令只会生成一行输出(在标准错误流上)。

但是,您使用的是zshshell,而不是bash.在zshshell 中,默认情况下,shell 会将同一流的多次重定向视为对复制那条溪流,好像tee被人用过一样。

这意味着

echo hello >/dev/stderr >&2

或者

echo hello >file1 >file2 >file3

分别重定向标准输出两次和树次,将以与以下相同的方式复制标准输出流

echo hello | tee /dev/stderr >&2

或者

echo hello | tee file1 file2 >file3

会做。

您可以通过取消MULTIOSshell 中的 shell 选项 ( unsetopt MULTIOS) 来禁用此行为。

相关内容