文章目录
一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
以上都是FILE* 类型的,也都分别指向一个FILE对象,这些FILE对象中封装了一个文件描述符,对应着相应文件。 但有些时候我们可能需要将数据从其它文件读入或读出,这就需要我们重定向。重定向的本质是:修改文件描述符fd下标 对应的struct file * 的内容 (将其换成目标文件的地址)。
1 输入重定向
我们可以让命令从文件中获取,这样本来的命令需要从标准输入stdin
中获取,转换为从我们的指定文件中获取。这样本来需要从键盘输入的命令就会转移到文件读取内容。语法如下:
command1 < file
2 输出重定向
同输入重定向很相似,输出重定向也是将本来需要输出标准输出文件stdout
中转化为我们的指定文件中,需要注意的是,这种输出重定向在使用的时候都会将原文件内容覆盖,如若需要保留原文件数据,我们就需要使用追加重定向,后文会进行解说。语法如下:
command1 > file
3 标准错误文件重定向
我们可以直接借助标准错误文件的文件描述符来重定向stderr
,语法如下:
$ command 2>file
扩充一点,如果我们想将stdout
标准输出文件和stderr
标准错误文件合并重定向到一个指定文件中,语法如下:
$ command > file 2>&1
4. Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。基本语法如下:
command << delimiter
document
delimiter
5 /dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null中,/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。语法如下:
$ command > /dev/null
6. 追加重定向
虽然输出重定向已经可以满足我们将输出的数据重定向到我们的指定文件中,但是这种重定向在每次输出数据时都会重新覆盖文件中的内容,而在实际生活中,我们经常需要将数据放在原文件的末尾,保留原文件内容的同时还要存放新数据,这时候就需要进行追加重定向,语法如下:
$ command >> file