1

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

  1. command 2>&1 > log
  2. command > log 2>&1
  3. command >& log
  4. command > log 1>&2

第一个将错误输出到控制台,然后输出到日志。为什么不两者都不去日志?

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

第三个和上一个一样。什么是捷径?

第四个将所有内容都放在控制台上,而没有放在日志中?

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

4

2 回答 2

4

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

command 2>&1 > log
  1. 将 FD 2(标准错误)的目标设置为 FD 1(标准输出)的目标,通常是终端。
  2. 将 FD 1 的目标设置为文件log

这些不是传递的,所以标准错误在命令运行时确实指向终端。


command > log 2>&1
  1. 将 FD 1 的目标设置为文件log
  2. 将 FD 2(标准错误)的目标设置为 FD 1(标准输出)的目标,现在是文件log.

这意味着标准输出和标准错误都记录到同一个文件中。


command >& log

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


command > log 1>&2
  1. 将 FD 1 的目标设置为文件log
  2. 将 FD 1 的目标设置为 FD 2 的目标(标准错误),通常是终端。这会覆盖先前的重定向。
于 2013-06-26T11:44:18.763 回答
2

重定向顺序在中很重要:

  1. command 2>&1 > log重定向stderrstdout然后stdout到日志文件。所以结果是stderr进入屏幕(如果没有在更高级别上重定向)并stdout进入文件。
  2. command > log 2>&1重定向stdout到文件,并stderr重定向到文件句柄1,即文件。
  3. command >&log是前一种情况的快捷方式,即重定向stderrstdout文件。
  4. 这与 #2 的情况相同
  5. command > log 1>&2stderr(文件句柄 1)重定向到文件,然后将其重定向到stderr. 所以结果stdout会去stderr。但是会出现一个零字节长的log文件。这可以写成command >log >&2
于 2013-06-26T11:46:37.710 回答