为什么以下输出重定向会导致打印两行?
将>&2
stdout 复制到 stderr 并将>/dev/stderr
stdout 重定向到 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
在bash
shell 中,重定向同一个流两次将导致流的内容被重定向到最后的(最右边)目的地。确实,如果您向bash
shell 提供所显示的命令,则每个命令只会生成一行输出(在标准错误流上)。
但是,您使用的是zsh
shell,而不是bash
.在zsh
shell 中,默认情况下,shell 会将同一流的多次重定向视为对复制那条溪流,好像tee
被人用过一样。
这意味着
echo hello >/dev/stderr >&2
或者
echo hello >file1 >file2 >file3
分别重定向标准输出两次和树次,将以与以下相同的方式复制标准输出流
echo hello | tee /dev/stderr >&2
或者
echo hello | tee file1 file2 >file3
会做。
您可以通过取消MULTIOS
shell 中的 shell 选项 ( unsetopt MULTIOS
) 来禁用此行为。