背景
在使用terminal时,当输出东西较多的时候就需要将结果输出到文件方便查看。在mac下的输出和windows还是略有差别需要记录一下。
stdout与stderr
在UNIX/Linux系统下,标准输出分为stdout(1)、stderr(2)两种。
默认在Terminal下两种都会输出,但是当使用重定向>
或者管道符|
输出到文件时,就默认仅会输出stdout(1)的内容,丢弃报错输出stderr(2)的内容。
比如我们ping一个不存在的地址:
Terminal环境下:
1
2zhengkaideMacBook-Pro:blog zhengk$ ping 1.com -c 2
ping: cannot resolve 1.com: Unknown host使用重定向
>
输出1
2
3
4zhengkaideMacBook-Pro:blog zhengk$ ping 1.com -c 2 > out.txt
ping: cannot resolve 1.com: Unknown host
zhengkaideMacBook-Pro:blog zhengk$ cat out.txt
zhengkaideMacBook-Pro:blog zhengk$会发现在Terminal中有输出,指定的输出文件也有生成,但是文本内容为空。
我们再ping一下baidu.com:
Terminal环境下:
1
2
3
4
5
6
7
8zhengkaideMacBook-Pro:blog zhengk$ ping baidu.com -c 2
PING baidu.com (123.125.114.144): 56 data bytes
64 bytes from 123.125.114.144: icmp_seq=0 ttl=51 time=110.056 ms
64 bytes from 123.125.114.144: icmp_seq=1 ttl=51 time=288.521 ms
--- baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 110.056/199.288/288.521/89.232 ms使用重定向
>
输出1
2
3
4
5
6
7
8
9
10zhengkaideMacBook-Pro:blog zhengk$ ping baidu.com -c 2 > out.txt
zhengkaideMacBook-Pro:blog zhengk$ cat out.txt
PING baidu.com (123.125.114.144): 56 data bytes
64 bytes from 123.125.114.144: icmp_seq=0 ttl=51 time=199.219 ms
64 bytes from 123.125.114.144: icmp_seq=1 ttl=51 time=502.690 ms
--- baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 199.219/350.954/502.690/151.736 ms
zhengkaideMacBook-Pro:blog zhengk$会发现,这次Terminal中没有输出,指定输出文本有生成,且存在内容。
结论
在用UNIX\Linux系统的Terminal时:
使用重定向
>
,管道符|
输出时,默认仅输出std(1)的内容,丢弃stderr(2)的内容可以通过指定输出的方式输出全部内容:
使用
&>
输出全部内容,该符号会将std(1)和stderr(2)的内容全部输出1
ping 1.com -c 1 &> out.txt
使用
>
输出时,指定将stderr(2)重定向到std(1)1
ping 1.com -c 1 > out.txt 2>&1
注意:有些命令的默认都输出到stderr(2),比如nc
命令:
1 | zhengkaideMacBook-Pro:~ zhengk$ nc -u -z 220.181.38.148 1 > out.txt |
根据上面输出可以发现,明明成功的但是并没有输出到文件,就需要改为全部输出:
1 | zhengkaideMacBook-Pro:~ zhengk$ nc -u -z 220.181.38.148 1 &> out.txt |