第六章 I/O重定向与管道

发布时间 2023-11-18 22:29:13作者: 一只飞鸟

1.I/O重定向

I/O重定向是指改变程序的标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)的默认设备,将其与其他设备或文件进行关联。通过I/O重定向,我们可以将程序的输入从键盘转向文件或其他设备,将程序的输出和错误信息输出到文件或其他设备而不是屏幕上。

标准输入重定向
标准输入重定向使用 < 符号来实现,它将一个文件中的内容作为程序的输入。例如,假设我们有一个名为input.txt的文件,其中包含了一些输入数据,我们可以通过以下方式将该文件内容作为程序的输入:

$ ./program < input.txt
这样,程序将会读取input.txt中的内容作为输入,而不是等待用户在终端中手动输入。

标准输出重定向
标准输出重定向使用 > 符号来实现,它将程序的输出保存到一个文件中。例如,我们可以通过以下方式将程序的输出保存到output.txt文件中:

$ ./program > output.txt
这样,程序的输出将会被重定向到output.txt文件中,而不是显示在终端上。

标准错误输出重定向
标准错误输出重定向使用 2> 符号来实现,它将程序的错误信息保存到一个文件中。例如,我们可以通过以下方式将程序的错误信息保存到error.log文件中:

$ ./program 2> error.log
这样,程序的错误信息将会被重定向到error.log文件中,而不是显示在终端上。

同时重定向输入和输出
有时候,我们希望同时重定向程序的输入和输出。我们可以使用 < 符号将输入重定向,使用 > 符号将输出重定向。例如:

$ ./program < input.txt > output.txt
这样,程序将会从input.txt文件中读取输入,并将输出保存到output.txt文件中。

追加输出和错误信息
除了覆盖式重定向,我们还可以使用 >> 符号将输出和错误信息追加到指定文件的末尾。例如:

$ ./program >> output.txt 2>> error.log
这样,程序的输出将会追加到output.txt文件的末尾,错误信息将会追加到error.log文件的末尾。

注意事项和技巧
在使用I/O重定向时,有一些注意事项和技巧可以帮助我们更好地应用这一功能:

如果要同时重定向输出和错误信息,并且希望它们合并保存到同一个文件中,可以使用 2>&1 符号。例如:

$ ./program > output.txt 2>&1
如果要将输出和错误信息都重定向到同一个文件中,并且希望输出和错误信息保持顺序,可以使用 &> 符号。例如:

$ ./program &> output.log
如果要将输出重定向到标准错误输出,可以使用 1>&2 符号。例如:

$ ./program 1>&2
可以使用 /dev/null 设备来丢弃不需要的输出或错误信息。例如,如果想屏蔽程序的错误信息,可以使用以下命令:

$ ./program 2> /dev/null
在使用I/O重定向时,可以通过管道(|)来连接多个命令,实现更复杂的操作。例如:

$ ./program1 | ./program2 > output.txt

2.进程管道

管道的作用是在命令和命令之间,传递数据。如一个命令的结果,就可以作为另一个命令的输入。更准确的说管道在进程间传递数据。

输入输出流
每个进程拥有自己的标准输入流、标准输出流、标准错误流。

标准输入流(用0表示)可以作为进程执行的上下文(进程执行执行可以从输入流获取数据)
标准输出流(用1表示)中写入的结果会被打印到屏幕上。
如果进程在执行过程中发生异常,那么异常信息被记录到标准错误流上

管道作用和分类

有了进程和重定向的知识,我们来梳理管道的作用。管道(Pipeline)将一个进程的输出流定向到另一个进程的输入流,就像水管一个,作用就是把两个文件连接起来。如果一个进程输出一个字符x,那么另一个进程获得x这个输入。

管道和重定向很像,但是管道是一个连接一个计算,重定向是将一个文件的内容定向到另一个文件,这两者经常会结合使用。