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 脚本输出捕获器。