Linux 输入输出(I/O)重定向

在解释什么是重定向之前,先来说说什么是文件描述符

Linux 文件描述符

文件描述符可以理解为 Linux 系统为文件分配的一个数字,范围是 0-3 ,用户也可以自定义文件描述符,但是自定文件描述符不在这里的讨论范围

文件描述符(file descriptor)

名称类型文件描述符操作
标准输入   standard input   0   <,<<  
标准输出   standard output   1   >,>>  
标准错误输出   standard error output   2   2>,2>>  

文件描述符的存储位置位于 /proc/self/fd ,文件描述符是通过一系列软链接指向的默认输出设备,这里我们的默认设备就是模拟终端

模拟终端的文件可以使用命令 tty 来查看

[divent@bash]$ ls -al /proc/self/fd total 0 lrwx------. 1 divent divent 64 Aug 15 14:09 0 -> /dev/pts/0 lrwx------. 1 divent divent 64 Aug 15 14:09 1 -> /dev/pts/0 lrwx------. 1 divent divent 64 Aug 15 14:09 2 -> /dev/pts/0

对于一条 Linux 的命令执行的过程如下

输入输出重定向流程图

用户开始从键盘(键盘在 Linux 上属于文件)输入数据,也就是系统从文件中读取数据的时候

shell 将接受到的数据(标准输入)传递给相应的命令开始执行

(yes)执行成功后,即可获得标准正确输出。(no)执行失败后,获得标准错误输出

在默认情况下,标准正确输出的结果与标准错误输出的缺省输出都为当前用户执行的终端

一个命令执行以前,会准备好所有的输入输出,默认分别绑定 stdin(0),stdout(1),stderr(2)。如果在准备命令的时候出现错误,那么这个命令将不会执行

2、输出重定向 格式

command [OPTION]{>,>>} [File] option: 1 standard output(default) 2 standard error output & all output

> 为覆盖输出,>>为追加输出

示例

#假设当前文件夹有文件 test2 [divent@bash]$ ls test test2 ls: cannot access test: No such file or directory test2

这里可以看到同时拥有的标准输出与标准错误输出都显示在了屏幕上
现在我们要将输出写入到文件中

#假设已经有文件 test2 , test3 [divent@bash]$ ls test test2 > test3 ls: cannot access test: No such file or directory [divent@bash]$ cat test3 test2

因为这里的文件只默认接受了标准输出,所以标准错误输出就输出到了终端上
我们也可以将标准错误输出写入到文件

#假设已经有文件 test2 , stderr [divent@bash]$ ls test test2 2> stderr test2 [divent@bash]$ cat stderr ls: cannot access test: No such file or directory

这里获得的结果就和刚刚的结果正好相反
我们也可以将标准输出与标准错误输出都重定向到不同的文件

#假设已经有文件 test2 , stdout , stderr [divent@bash]$ ls test test2 1> stdout 2>stderr [divent@bash]$ cat stdout test2 [divent@bash]$ cat stderr ls: cannot access test: No such file or directory

这里我们就将两个不同的输出输出到了指定的文件中
我们也可以将两个输出同时输出到同一个文件中

#假设已经有文件 test2 , test3 [divent@bash]$ ls test test2 &> test3 [divent@bash]$ cat test3 ls: cannot access test: No such file or directory test2

这里就使用 \& 将两种输出同时输出到了同一个文件
我们也可以只接受某一种输出,而将其他的输出导向到其他地方

#假设已经有文件 test2 [divent@bash]$ ls test test2 2>&- test2 [divent@bash]$ ls test test2 2>/dev/null test2 # &- 意义为关闭这个输出,/dev/null 是 linux 的黑洞设备

注意

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15062.html