重定向符号 > 2> &> 2>&1 的区别
在 Linux 中, 0 表示 STUIN, 1 表示 STDOUT, 2 表示 STDERR, 3~8 由用户自行定义.
重定向符号 >
表示将送往 STDOUT
的输出重定向到文件, 2>
表示将送往 STDERR
的输出重定向到文件, &>
表示将 STDOUT
和 STDERR
一同重定向到文件, 2>&1
表示将 STDERR
重定向到 STDOUT
重定向的位置.
下面是几个例子, 首先建立一个Python脚本, 第一行是正常输出(数据流), 第二行会产生错误:
直接运行脚本, 数据和错误都被输出到了屏幕.
[root@aliyun ~]# python py_output.py
stdout
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
使用 >
将数据输出重定向, 则屏幕上只有错误输出. 数据输出重定向到了 log.txt 文件
[root@aliyun ~]# python py_output.py > log.txt
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
[root@aliyun ~]# cat log.txt
stdout
使用 2>
错误输出重定向, 结果则正好相反, 屏幕上只有数据输出.错误输出重定向到了 log.txt 文件
[root@aliyun ~]# python py_output.py 2> log.txt
stdout
[root@aliyun ~]# cat log.txt
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
也可以同时 >
和 2>
将数据输出和错误输出分别重定向. 下面代码将数据输出重定向到了 log1.txt, 将数据输出重定向到了 log2.txt.
[root@aliyun ~]# python py_output.py > log1.txt 2> log2.txt
[root@aliyun ~]# cat log1.txt
stdout
[root@aliyun ~]# cat log2.txt
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
如果想把数据输出和错误输出重定向到同一个文件, 还可以采用 &>
, 这样屏幕上将不会有输出.
[root@aliyun ~]# python py_output.py &> log.txt
[root@aliyun ~]# cat log.txt
stdout
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
接下来看看 2>&1
, 2>&1
把错误输出重定向到数据输出. 直接使用 2>&1
和不使用任何重定向没有区别, 因为 STUERR
最终也会流向屏幕.
[root@aliyun ~]# python py_output.py 2>&1
stdout
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
若先对数据输出进行重定向, 则再使用 2>&1
将会把错误输出重定向到 重定向了的数据输出 (这个有点绕)
[root@aliyun ~]# python py_output.py > log.txt 2>&1
[root@aliyun ~]# cat log.txt
stdout
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
如果把 2>&1
写到前面, 则错误会被输出到屏幕, 而数据会被输出到文件.
[root@aliyun ~]# python py_output.py 2>&1 > log.txt
Traceback (most recent call last):
File "py_output.py", line 2, in <module>
print(1/0)
ZeroDivisionError: division by zero
[root@aliyun ~]# cat log.txt
stdout