linux的管道及重定向

发表于: 2013年10月25 00:00

在这篇文章里面,我将总结一下重定向和管道相关命令,同时会介绍一些具体的示例 linux的I/O重定向在shell里面很常用。通过重定向可以提高我们的工作及学习的效率

通过重定向或者管道我们能够改变一个数据流的流向亦或是一个数据流的源。(在linux的shell里面 ,输入和输出的都是一串串的字符,像水流一样,我们把它称为字符流)

linux的shell中有3个标准的流,对应着三个不同的文件描述符(文件描述符是系统用来标记不同文件的 一个无符号整形数)。他们分别是:

文件描述符      流类型          详细
0               标准输入流      一般指由键盘输入的数据
1               标准输出流      一般直接输出到屏幕上
2               标准错误流      一般也直接输出到屏幕上

这里我们将介绍一下重定向命令。

linux shell里使用 > 和 < 符号来表示重定向。那么他们怎么使用呢?

:::bash
#代码1
ls -a >test  

上面语句ls -a 执行会列出当前目录下的所有文件。但是执行完上面语句,会发现并没有在屏幕上输出信息 这是因为>有重定向的作用,将本来显示在屏幕上内容,重新定向到了当前目录下的test文件里,所以如果 你不想屏幕上显示大量的信息,则可以使用重定向,将输出重定向到其他位置,比如说,将标准输出重定向 到/dev/null中,将错误输出重定向到日志文件中,方便查错。

(使用 > 时,test文件不存在,则会自动创建一个,如果存在则会覆盖之前的文件)

:::bash
#代码2
echo "1+2+3+4+5">test  #在test文件里写入1+2+3+4+5这个表达式
bc<test                #bc是一个计算器程序

上面的命令bc本来是从键盘接受用户的输入,但是在这里我们我们用<来重定向了标准输入流,使其从test这个文 件里读取数据,而不是键盘。这样通过重定向标准输入流可以完成很多自动化的脚本

那么管道命令又是什么呢?简单理解shell中的管道命令是可以在各个应用程序的之间传送数据流的“设备”。

管道的操作符是 |

下面看具体的shell命令吧

:::bash
#代码3
echo "1+2+3+4+5"|bc

上面命令,左边的命令本来会在屏幕上输出1+2+3+4+5,但是由于使用了管道,整个数据就随着管道,流入了 bc这个命令中,并最终计算出结果。

通过代码2和代码3的比较可以发现。重定向要么是将数据重定向到文件,要么是从文件读取数据。 而管道则不同,管道连接了两个应用程序,左侧的有标准输出,右侧的有标准输入。通过管道,能将 一个程序的输出导入到一个程序的输入中。

最后在这里在介绍一个命令tee。tee的作用是能将数据复制屏幕和几个不同的文件中(重定向的加强版) 例如:

:::bash
echo “hello”|tee aa bb cc #能见hello输出到屏幕,并分别拷贝一份到aa,bb,cc三个文将中

我们执行下面命令,系统可能会报权限不足

sudo echo "hello" > /etc/test

算然我们使用sudo来提升了权限,但是sudo提升的是echo的权限,并没有改变重定向的权限。这里,一种 简单的解决办法就是使用tee命令

:::bash
echo "hello" |sudo tee /etc/test

借助重定向和管道,可以很好的在多个程序之间传递数据,简化脚本,提高脚本的编写和执行效率

© 2018 - fluyy - 粤ICP备17114935号