重定向中顺序什么时候很重要?

重定向中顺序什么时候很重要?

printf "..." 1>&2我编写了一个脚本,该脚本在函数内部有一些注销。运行该脚本(build.sh),我注意到如果我想将 stderr 重定向到 stdout,并将 stdout 重定向到文件 [0],成功取决于顺序:

  • ./build.sh 2> /tmp/log.txt有效(显然)
  • ./build.sh 1>/tmp/log.txt 2>&1作品
  • ./build.sh 2>&1 1>/tmp/log.txt不重定向到该文件

echo

  • echo "test" 2>&1 >/tmp/log.txt作品
  • echo "test" >/tmp/log.txt 2>&1作品

这在 bash、zsh 中被复制,并最初在 mksh 中报告。

命令中重定向语句的顺序何时重要?谢谢!

0:不确定为什么我会这样做,但脚本的用户尝试了它,并在重定向失败时感到困惑。

答案1

顺序很重要,因为重定向是按照从左到右列出的顺序执行的。在第二个示例(正确)中,./build.sh 1>/tmp/log.txt 2>&1它首先将 fd“1”映射到文件,然后将“1”复制为“2”,并使用此映射执行构建脚本。在第三个示例(不起作用)中,它首先复制当前的“1”作为“2”,并且只有在这之后才将“1”映射到文件。当前的“1”不是复制时的文件。这是您的终端或 CI shell 脚本输出捕获器。

相关内容