【问题标题】:How should I understand "> outfile 2>&1" and " 2>&1 > outfile"?我应该如何理解“> outfile 2>&1”和“2>&1 > outfile”?
【发布时间】:2014-08-10 14:50:48
【问题描述】:

我无法理解这两种情况的区别:

  1. ./a.out > outfile 2>&

    我可以在 outfile 中看到标准输出和错误输出

  2. ./a.out 2>& > outfile

    我只能看到标准输出int outfile,屏幕上打印了错误输出

我该如何理解? 我觉得他们是一样的!

【问题讨论】:

  • 参见例如a shell manual page,他们解释得很好。
  • @JoachimPileborg:虽然您的评论可能没有错,但指向一个密集的、未编入索引的 5MB+ 文本文档并说“它在其中的某个地方,你为什么没有看到它”似乎有点残忍。 ..
  • @KerrekSB 好吧,在顶部有一个指向名为REDIRECTION 的部分的链接,应该不难找到。除非人们不知道上面发生的事情是重定向。
  • @JoachimPileborg:为什么不将片段标识符添加到链接中? :-)
  • @KerrekSB 我正要这样做,但分心了。 :)

标签: c linux shell unix


【解决方案1】:

n> file 创建/截断file 并将其关联到文件描述符n。如果未指定n,则假定为1(即标准输出)。

n>&m 复制(使用dup2())文件描述符mn

所以如果你写./a.out 2>& >outfile,那么首先将标准输出描述符复制到stderr描述符上,然后将stdout重定向到outfile。

如果您愿意,可以将这些重定向运算符视为赋值:

  • 2>& >file 会读作fd2 := fd1; fd1 := "file",这与
  • >file 2>&fd1 := "file"; fd2 := fd1

【讨论】:

  • @adl ":=" 代表什么?为什么方向不一样?
  • @JasonYang x := y 代表 assign y to x(如在 ALGOL、Smalltalk、Pascal、Ada、OCaml、Eiffel、VHDL 中......所有这些语言一致认为,由于赋值不是对称操作,它不应该有对称符号)。方向正是这里的重点:它是一样的,你总是从右到左分配。 2>&1 表示将 fd1 复制到 fd2 上,从右到左读取。
  • @adl 似乎我混合了这两个概念:2>&1 应该理解为将 fd1 重定向到 fd2,但应该理解为 let fd1 := fd2。当我们说重定向时,方向是从左到右,但是当我们说分配时,它应该从右到左读取。我说的对吗?
【解决方案2】:

重定向按顺序应用。在2>&1 > file 中,首先将stderr 替换为stdout 的副本,然后将stdout 替换为新打开的文件。将每个重定向视为 C 中的 dup2 调用。

【讨论】:

    【解决方案3】:

    根据Bash 参考手册,“2>&1> file”仅将标准输出定向到“file”,因为标准错误输出是标准输出的副本;而“>file 2>&1”将标准输出和标准错误输出都指向“file”。

    【讨论】:

    • 我从结果中知道这一点。但我想要一个内部原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多