I/O重定向与管道

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

6.1I/O重定向

每一个进程在运行中都会打开一些文件,每一个文件都会有一个指定的数字标识,这个标识就叫文件描述符。0表示标准输入,可以理解为键盘输入;1表示标准输出,输出到终端;2表示标准错误,输出到终端;3及以上为常规文件的描述符。

 

date命令在默认情况下将输出结果显示在终端,此时文件描述符为1。现在改变输出的方向,从终端改为date.txt文件,这个行为叫作重定向。改变描述符为2的文件的输出方向,date命令是正确的,执行结果在终端中显示;输入命令是错误的,执行结果标准输出在终端上,重定向到date.txt;cat命令默认文件描述符为0,输入重定向把键盘输入改为/etc/hosts文件输入,具体如下所示:

 

6.1.1输出重定向

输出重定向分为正确输出与错误输出。正确输出:1> 、1>> 等价于 >、 >>,1可省略。错误输出:2> 、2>>。其中,“>”表示覆盖,“>>”表示追加。具体如下所示

6.1.2输入重定向

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

1.使用grep命令过滤root,没有改变输入端,默认为键盘,接着把输入重定向到/etc/passwd。加或不加“<”符号,输出结果一样,但原理是不一样的。/ect/passwd一个是作为文件,一个是作为参数。

 2.使用dd命令从/dev/zero中读取数据并写入到file01.txt文件,每次写入1MiB,一共写入2次。使用输入重定向与输出重定向的方式也可以实现同样的功能。

 3.使用at命令创建一个计划任务,从现在开始5分钟后创建用户linux,按组合键Ctrl+d结束。若同时创建多个用户,以此方法从键盘输入会十分烦琐,使用输入重定向则会非常方便。

 

 

6.1.3重定向综合案例

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

>”表示覆盖,但在此处是指覆盖原来的file03.txt,输入的3行文本一次输出到file03.txt。如果退出后再次输出,那将覆盖掉先前的文本内容,此时就需要用“>>”进行追加。每次写入文本都需要按组合键Ctrl+d结束显得比较烦琐,用户可以自定义一个结束的符号,通常使用“EOF”。

2.利用重定向建立多行文件(脚本)。命令行和脚本都可以操纵Shell。在命令行中可以用组合键Ctrl+d退出,但在脚本中不可以。下面利用脚本创建多行文件,在脚本文件中写入文本,并加入“EOF”结束符号;使用bash执行该脚本;在编写脚本时,为了排版整齐,经常在“EOF”前面使用tab键缩进,同时在输入重定向符后添加“-”。

3.在脚本中利用重定向打印消息。在编写脚本时,将cat命令的输入重定向,输出不做修改。

4.多条命令输出重定向。如果需要将两条命令输出都重定向,则需要添加括号;让命令在后台运行,并且输出重定向到文件;终止后台程序。

6.1.4Subshell

Subshell 是指圆括号里的命令会在另外的进程中执行。当需要让一组命令在不同的目录下执行时,采用这种方法可以不修改主脚本的目录。对比不加圆括号的命令与加圆括号的命令。如果不希望某些命令的执行对当前Shell环境产生影响,请在Subshell中执行。

6.2进程管道

管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序。管道的作用是把上一个进程的输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起。tee管道的功能类似于生活中的三通水管,一条输入满足两个需求。在执行Linux命令时,一个进程标准输出通过管道作为下一个进程的标准输入,同时该输出通过tee管道重定向到一个文件或者终端。在使用管道时,前一个命令的标准错误输出不会被tee读取。

学习心得

在本次学习过程中,我明白了I/O重定向是指将命令的输入和输出重定向到文件中,从而实现对文件的读写操作。在实际操作中,我学会了如何使用">"符号将命令的输出重定向到文件中,以及如何使用"<"符号将文件的内容作为命令的输入。我还学会了如何将命令的错误输出重定向到文件中。这让我在调试程序时更加方便,可以将错误信息保存到文件中进行分析。同时,我也了解了如何使用"2>"符号将错误输出重定向到文件中。最后,我还了解了一些高级的操作,如如何使用">>"符号将命令的输出追加到文件中,以及如何使用"&>"符号将命令的所有输出重定向到文件中。在对管道的学习中,我发现它是一个非常强大的工具,可以将一个命令的输出作为另一个命令的输入,从而实现多个命令的协同工作。我学会了如何使用"|"符号来连接多个命令,实现数据的流水线处理。总的来说,通过对I/O重定向与管道的学习,我对Linux系统中数据流的控制机制有了更深入的理解,也提升了我的工作效率和处理数据的能力。这些知识不仅对我在Linux系统管理和运维方面有着重要的意义,也为我在日常工作中更好地处理数据提供了有力的支持。

posted @ 2023-11-25 10:05  木青梧  阅读(48)  评论(0)    收藏  举报