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

发布时间 2023-11-20 20:07:18作者: Wybzyx

一、I/O重定向

在讲解I/O重定向之前,先演示一个简单的案例。打开一个终端3,输入date命令,会显示出当前时间。如果在date命令后加“>”,并指向date.txt文件,那么结果就会写入date.txt文件。具体如下所示。

 上述命令将date的输出结果重定向到一个普通文件。接着再打开一个终端1,将终端0的date输出结果重定向到终端1,具体如下所示。

例如,date命令在默认情况下将输出结果显示在终端,此时文件描述符为1。现在改变输出的方向,从终端改为date.txt文件,这个行为叫作重定向,具体如下所示。

 改变描述符为2的文件的输出方向,date命令是正确的,执行结果在终端中显示,具体如下所示。

 输入命令是错误的,执行结果标准输出在终端上,重定向到date.txt,具体如下所示。

 cat命令默认文件描述符为0,输入重定向把键盘输入改为/etc/hosts文件输入,具体如下所示。

 进程使用文件描述符来管理打开的文件

1.1 输出重定向

输出重定向分为正确输出与错误输出。

正确输出:1> 、1>> 等价于 >、 >>,1可省略。

错误输出:2> 、2>>。其中,“>”表示覆盖,“>>”表示追加,具体如下所示。

 【例6-4】正确结果与错误结果都输出到相同位置

 【例6-5】 正确结果与错误结果都输出重定向到相同的位置

 【例6-6】 正确结果保留在文件list.txt,错误结果丢到/dev/null

1.2 输入重定向

输入重定向与输出重定向异曲同工,下面以具体的示例加以说明。

【例6-7】 使用grep命令过滤root,没有改变输入端,默认为键盘,接着把输入重定向到/etc/passwd。

 加或不加“<”符号,输出结果一样,但原理是不一样的。/ect/passwd一个是作为文件,一个是作为参数。

【例6-8】 使用dd命令从/dev/zero中读取数据并写入到file01.txt文件,每次写入1MiB,一共写入2次。

 使用输入重定向与输出重定向的方式也可以实现同样的功能。

 【例6-9】 使用at命令创建一个计划任务,从现在开始5分钟后创建用户linux,按组合键Ctrl+d结束。

 若同时创建多个用户,以此方法从键盘输入会十分烦琐,使用输入重定向则会非常方便。

1.3 重定向综合案例

 【例6-10】 利用重定向建立多行文件(命令行)。

使用echo命令重定向并不能建立多行文件,一般使用cat命令,在键盘上输入文本按回车键换行,完成后按组合键Ctrl+d结束。

 “>”表示覆盖,但在此处是指覆盖原来的file03.txt,输入的3行文本一次输出到file03.txt。如果退出后再次输出,那将覆盖掉先前的文本内容,此时就需要用“>>”进行追加。

每次写入文本都需要按组合键Ctrl+d结束显得比较烦琐,用户可以自定义一个结束的符号,通常使用“EOF”。

 【例6-11】 利用重定向建立多行文件(脚本)。

命令行和脚本都可以操纵Shell。在命令行中可以用组合键Ctrl+d退出,但在脚本中不可以。下面利用脚本创建多行文件,在脚本文件中写入文本,并加入“EOF”结束符号。

 使用bash执行该脚本。

1.4 Subshell

 Subshell 是指圆括号里的命令会在另外的进程中执行。当需要让一组命令在不同的目录下执行时,采用这种方法可以不修改主脚本的目录。

二、进程管道

管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序。

管道的作用是把上一个进程的输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起。

三、总结

       I/O重定向和管道是在Unix和类Unix操作系统中常用的功能,用于控制进程之间的输入和输出。它们提供了一种灵活的方式来处理进程之间的通信,同时也可以实现对输入和输出的控制。I/O重定向允许用户将一个进程的标准输入和输出连接到另一个文件或设备上。这样就可以将一个进程的输出发送到一个文件中,或者从一个文件中读取输入,而不是从终端或键盘输入。这种功能对于批处理操作和脚本编程非常有用,因为它可以自动化输入和输出流程,而无需手动输入和输出。

       在Unix系统中,I/O重定向使用特殊的符号来实现。例如,">"符号可以将一个命令的输出重定向到一个文件中,"<"符号可以将一个文件的内容作为输入发送给一个命令。另外,">>"符号可以将一个命令的输出追加到一个文件的末尾,而不是覆盖整个文件。

       管道是另一种进程间通信的方式,它允许一个进程的输出直接作为另一个进程的输入。这种功能可以将多个命令连接在一起,形成一个管道,从而实现复杂的数据处理和转换操作。例如,可以使用管道将一个命令的输出发送给另一个命令进行处理,然后再将处理结果发送给第三个命令,以此类推。在Linux系统中,管道使用竖线符号"|"来实现。例如,命令"ls | grep .txt"将列出当前目录下的所有文件,并将包含".txt"的文件名输出到grep命令中进行过滤。通过灵活运用I/O重定向和管道,用户可以更加高效地处理和管理进程之间的输入和输出,从而提高工作效率和系统性能。