不同的输入/输出重定向样式有什么区别?

时间:2013-06-26 11:37:50

标签: linux bash

这些命令之间有什么区别:

  1. command 2>&1 > log
  2. command > log 2>&1
  3. command >& log
  4. command > log 1>&2
  5. 首先将错误输出到控制台,然后输出到日志。为什么不两者都不去日志?

    第二个不产生任何输出,输出和错误都在日志中。将2>&1放在最后会有什么不同?

    第三个与之前相同。这是什么捷径?

    第四个将所有内容都放到控制台上,而不是日志中的任何内容?

    示例命令:ls -ld /tmp /xxx

2 个答案:

答案 0 :(得分:4)

这些在two articles中得到了很好的解释。实质上,您必须从左到右阅读重定向作为输出目标的副本。所以

command 2>&1 > log
  1. 将FD 2(标准错误)的目标设置为FD 1(标准输出)的目标,通常是终端。
  2. 将FD 1的目标设置为文件log
  3. 这些不是传递性的,因此当命令运行时,标准错误确实指向终端。


    command > log 2>&1
    
    1. 将FD 1的目标设置为文件log
    2. 将FD 2(标准错误)的目标设置为FD 1(标准输出)的目标,现在是文件log
    3. 这意味着标准输出和标准错误都记录在同一个文件中。


      command >& log
      

      将标准错误和标准输出重定向到文件log。这是前一个命令的Bash语法糖。


      command > log 1>&2
      
      1. 将FD 1的目标设置为文件log
      2. 将FD 1的目标设置为FD 2的目标(标准错误),通常是终端。这会覆盖先前的重定向。

答案 1 :(得分:2)

重定向顺序在中非常重要:

  1. command 2>&1 > logstderr重定向到stdout,然后将stdout重定向到日志文件。结果是stderr进入屏幕(如果没有在更高级别重定向),stdout转到文件。
  2. command > log 2>&1stdout重定向到某个文件,并将stderr重定向到文件句柄1
  3. command >&log是上一个案例的快捷方式,即将stderrstdout重定向到该文件。
  4. 这与#2
  5. 的情况相同
  6. command > log 1>&2stderr(文件句柄1)重定向到文件,然后将其重定向到stderr。因此,结果stdout将转到stderr。但是会出现零字节长的log文件。这可以写成command >log >&2