当我们将shell脚本的输出重定向到/dev/stdout或/dev/stderr时,我注意到了一些非常奇怪的行为。
Shell脚本
$ cat test.sh
#!/bin/bash -x
echo stdout
echo stderr >&2
echo '/dev/stdout' > /dev/stdout
echo '/dev/stderr' > /dev/stderrBaseline:不重定向
$ ./test.sh
+ echo stdout
stdout
+ echo stderr
stderr
+ echo /dev/stdout
/dev/stdout
+ echo /dev/stderr
/dev/stderr如果我们不执行任何重定向,一切都会像我们预期的那样出现。
Redirect标准输出
$ ./test.sh > out
+ echo stdout
+ echo stderr
stderr
+ echo /dev/stdout
+ echo /dev/stderr
/dev/stderr
$ cat out
/dev/stdout当我们重定向stdout时,"/dev/stdout“行按预期被重定向,但是"stdout”行不再出现在任何地方。
分离文件的Redirect流
$ ./test.sh > out 2> err
$ cat out
/dev/stdout
$ cat err
/dev/stderr不仅"stderr",而且"bash -x“行也消失了。
Redirect流到同一个文件
$ ./test.sh > out 2>&1
$ cat out
/dev/stderr在最后一种情况下,我们丢失了最后一个示例中的所有内容,"/dev/stdout“(以前成功地重定向到该文件)也不见了。
使用shell脚本中的exec行进行重定向,例如exec 1>out; exec 2>&1;,会产生与从命令行重定向相同的行为。
问题是:为什么缺少行,脚本的每一行(包括命令行重定向正在执行的隐式exec行)会发生什么情况?最好是后者的答案将描述所涉及的系统调用(dup2?)。
发布于 2020-11-24 21:38:14
因为您要重定向到一个文件
echo '/dev/stdout' > /dev/stdout
echo '/dev/stderr' > /dev/stderr将覆盖(而不是附加到)文件。当您不重定向时,您不会注意到这一点,因为您只能附加到stdout/stderr。
代之以
echo '/dev/stdout' >> /dev/stdout
echo '/dev/stderr' >> /dev/stderr一切都恢复正常。
https://unix.stackexchange.com/questions/621385
复制相似问题