首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IO-重定向:这些示例中缺少的输出行发生了什么变化?

IO-重定向:这些示例中缺少的输出行发生了什么变化?
EN

Unix & Linux用户
提问于 2020-11-24 20:55:04
回答 1查看 717关注 0票数 1

当我们将shell脚本的输出重定向到/dev/stdout或/dev/stderr时,我注意到了一些非常奇怪的行为。

Shell脚本

代码语言:javascript
复制
$ cat test.sh
#!/bin/bash -x
echo stdout
echo stderr >&2
echo '/dev/stdout' > /dev/stdout
echo '/dev/stderr' > /dev/stderr

Baseline:不重定向

代码语言:javascript
复制
$ ./test.sh
+ echo stdout
stdout
+ echo stderr
stderr
+ echo /dev/stdout
/dev/stdout
+ echo /dev/stderr
/dev/stderr

如果我们不执行任何重定向,一切都会像我们预期的那样出现。

Redirect标准输出

代码语言:javascript
复制
$ ./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流

代码语言:javascript
复制
$ ./test.sh > out 2> err

$ cat out
/dev/stdout

$ cat err
/dev/stderr

不仅"stderr",而且"bash -x“行也消失了。

Redirect流到同一个文件

代码语言:javascript
复制
$ ./test.sh > out 2>&1

$ cat out
/dev/stderr

在最后一种情况下,我们丢失了最后一个示例中的所有内容,"/dev/stdout“(以前成功地重定向到该文件)也不见了。

使用shell脚本中的exec行进行重定向,例如exec 1>out; exec 2>&1;,会产生与从命令行重定向相同的行为。

问题是:为什么缺少行,脚本的每一行(包括命令行重定向正在执行的隐式exec行)会发生什么情况?最好是后者的答案将描述所涉及的系统调用(dup2?)。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-11-24 21:38:14

因为您要重定向到一个文件

代码语言:javascript
复制
echo '/dev/stdout' > /dev/stdout
echo '/dev/stderr' > /dev/stderr

将覆盖(而不是附加到)文件。当您不重定向时,您不会注意到这一点,因为您只能附加到stdout/stderr。

代之以

代码语言:javascript
复制
echo '/dev/stdout' >> /dev/stdout
echo '/dev/stderr' >> /dev/stderr

一切都恢复正常。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/621385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档