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