这些命令之间有什么区别:
command 2>&1 > log
command > log 2>&1
command >& log
command > log 1>&2
首先将错误输出到控制台,然后输出到日志。为什么不两者都不去日志?
第二个不产生任何输出,输出和错误都在日志中。将2>&1
放在最后会有什么不同?
第三个与之前相同。这是什么捷径?
第四个将所有内容都放到控制台上,而不是日志中的任何内容?
示例命令:ls -ld /tmp /xxx
答案 0 :(得分:4)
这些在two articles中得到了很好的解释。实质上,您必须从左到右阅读重定向作为输出目标的副本。所以
command 2>&1 > log
log
。这些不是传递性的,因此当命令运行时,标准错误确实指向终端。
command > log 2>&1
log
。log
。这意味着标准输出和标准错误都记录在同一个文件中。
command >& log
将标准错误和标准输出重定向到文件log
。这是前一个命令的Bash语法糖。
command > log 1>&2
log
。答案 1 :(得分:2)
重定向顺序在bash中非常重要:
command 2>&1 > log
将stderr
重定向到stdout
,然后将stdout
重定向到日志文件。结果是stderr
进入屏幕(如果没有在更高级别重定向),stdout
转到文件。command > log 2>&1
将stdout
重定向到某个文件,并将stderr
重定向到文件句柄1
。command >&log
是上一个案例的快捷方式,即将stderr
和stdout
重定向到该文件。command > log 1>&2
将stderr
(文件句柄1)重定向到文件,然后将其重定向到stderr
。因此,结果stdout
将转到stderr
。但是会出现零字节长的log
文件。这可以写成command >log >&2
。