重定向符号 > 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