Linux IO重定向的原理及实现

Linux I/O重定向的原理及实现


在Linux系统中,每个进程都有STDIN、STDOUT、STDERR这三种标准I/O。用过shell的同学们都知道,我们可以方便地对shell命令进行I/O重定向。

对Linux进程来讲,每个打开的文件都是通过文件描述符(File Descriptor)来标识的,内核为每个进程维护了一个File Descriptor Table(文件描述符表),这个表以FD为索引,再进一步指向文件的详细信息。在进程创建时,内核为进程默认创建了0、1、2三个特殊的FD,这就是STDIN、STDOUT和STDERR,如下图所示意:

平常说的Linux中的bash I/O重定向也就是让已创建的FD指向其他文件。比如,下面是对STDOUT重定向到testfile.txt前后内核文件描述符表变化的示意图:

Linux下I/O重定向例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
输出重定向:>
# 将stdout重定向到一个文件.
# 如果这个文件不存在, 那就创建, 否则就覆盖.

举例:ls /etc > etc-tree.list
#创建一个包含/etc目录树列表的文件.

输出重定向:>>
# 将stdout重定向到一个文件.
# 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.


# 单行重定向命令(只会影响它们所在的行)
1>filename
# 重定向stdout到文件"filename".
1>>filename
# 重定向并追加stdout到文件"filename".
2>filename
# 重定向stderr到文件"filename".
2>>filename
# 重定向并追加stderr到文件"filename".
&>filename
# 将stdout和stderr都重定向到文件"filename".



错误输出流重定向:2>, 2>>

合并正常输出流和错误输出流:
COMMAND &> /path/to/somefile # 标准输出重定向到文件

COMMAND &>> /path/to/somefile # 标准输出覆盖重定向到文件

COMMAND > /path/to/somefile 2>&1 #覆盖输出

COMMAND >> /path/to/somefile 2>&1 #追加输出

COMMAND >> /path/to/somefile #追加输出

COMMAND file1 > access 2> error #成功输出覆盖到access,错误输出到error
0%