fd - 在C语言中通常代表file descriptor, "文件代码" 这个名字我是第一次听说.
终端里, 主要就是管道与重定向有一点不好理解, 但只用多用几次, 问题不大.
0 - 标准输入, 向终端里敲字符
1 - 标准输出, 比如在终端里: $ echo 'Hello, World!' 就会打印出Hello, World.
2 - 错误输出, 程序运行出错, 是很常见的问题, 为了区别正常输出流, 才引入了错误输出. 比如你输命令时, 可能少了一个选项, 没办运行, 这时会提示你你输入有误, 然后打印出一些帮助信息, 并退出.
这是从上个世纪遗留下来的用法, 当时还是大型机时代, 我们可以这样理解, 有一个终端(终端0)专门向里面输入代码, 输入命令, 命令/代码运行后, 会将运算结果显示到终端1(标准输出); 但是如果命令运算出了问题, 它会将错误信息输出到终端2(错误输出).
重定向的话, 可以这样理解, 我用例子来说吧:
tcpdump -vv -s 0 -c 1000 -w mozilla.pcap 1>/dev/null 2>&1
这里, 运行一个tcpdump程序来抓包, 我们不想看到它显示出的实时数据, 就把它的标准输出流(1) 重定向到/dev/null, /dev/null是一个特殊的文件, 就像黑洞一样, 它可以接收数据流输入但不会有任何回应.
同时, 我们还把错误输出(2), 重定向到了标准输出1上, 因为1已经被重定向到了/dev/null, 所以输出到2的数据也被重定向到了/dev/null, 就相当于这样写了:
tcpdump -vv -s 0 -c 1000 -w mozilla.pcap 1>/dev/null 2>/dev/null
因为在linux里, 经常要用到ssh, 比如你在连接到web服务器上抓一下数据包, 就需要用到上面的数据流重定向了, 不然的话, tcpdump输出的数据, 会通过ssh显示到你的本地终端, 这样的话tcpdump也会把这个ssh数据也一并抓取的, 这显然不是我们想要的结果.
另一个常用到的地方就是将输出重定向到日志文件:
代码: 全选
$ some_commands_here 1>log 2>error
这样分别将标准输出和错误输出重定向到了log 和error这两个文件.
有时候还要将新的日志记录追加到磁盘上的日志文件:
代码: 全选
$ some_commands 1>>log 2>>error
关键是多用几次.