MAC之Terminal输出到文本

背景

在使用terminal时,当输出东西较多的时候就需要将结果输出到文件方便查看。在mac下的输出和windows还是略有差别需要记录一下。

stdout与stderr

在UNIX/Linux系统下,标准输出分为stdout(1)、stderr(2)两种。

默认在Terminal下两种都会输出,但是当使用重定向>或者管道符|输出到文件时,就默认仅会输出stdout(1)的内容,丢弃报错输出stderr(2)的内容。

比如我们ping一个不存在的地址:

  • Terminal环境下:

    1
    2
    zhengkaideMacBook-Pro:blog zhengk$ ping 1.com -c 2
    ping: cannot resolve 1.com: Unknown host
  • 使用重定向>输出

    1
    2
    3
    4
    zhengkaideMacBook-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
    8
    zhengkaideMacBook-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
    10
    zhengkaideMacBook-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
2
3
zhengkaideMacBook-Pro:~ zhengk$ nc -u -z 220.181.38.148 1 > out.txt
Connection to 220.181.38.148 port 1 [udp/tcpmux] succeeded!
zhengkaideMacBook-Pro:~ zhengk$ cat out.txt

根据上面输出可以发现,明明成功的但是并没有输出到文件,就需要改为全部输出:

1
2
3
4
zhengkaideMacBook-Pro:~ zhengk$ nc -u -z 220.181.38.148 1 &> out.txt
zhengkaideMacBook-Pro:~ zhengk$ cat out.txt
Connection to 220.181.38.148 port 1 [udp/tcpmux] succeeded!
zhengkaideMacBook-Pro:~ zhengk$