管道符:|我们在Linux下经常使用管道符,就是“|”,就是一个竖线。这个运算符的作用对于经常使用Linux的人来说似乎很直观:不就是把上一条指令的结果交给下一条指令吗?例如:catsystem.log|grephello复制代码上面的命令允许我们过滤掉system.log文件中包含hello字符串的行,然后将它们打印到屏幕上。指令的结果是什么的问题出现了。一条指令的结果是什么,很让人费解。指的是这条命令输出的日志?指的是这条命令的返回码?(有些人可能不知道这个东西)或者是什么意思?事实上,指令结果的概念并没有严格的定义,所以我们说指令结果的时候,往往和业务场景有关。例如,图像处理程序的结果应该是图像是合乎逻辑的。如何描述cat命令的行为首先,让我们看一下catsystem.log命令的行为。即把system.log的内容打印到屏幕上。这个过程可以细化,因为打印到屏幕上的内容其实不够准确。那么这里就不得不涉及到Linux下文件的一些概念。程序打开文件和文件描述符在Linux系统中,一个程序可以打开一个文件,这个很容易理解。那么一个进程(一般是一个正在运行的程序称为进程)是如何管理文件的呢?这有点像文件描述符,它是一个数字和与之关联的一堆数据。当一个进程打开一个文件时,一个新的文件描述符被创建,这个数字一般是自增的。比如当前文件描述符是100。然后打开一个新文件,这个新文件的描述符是101。当然如果进程关闭文件,这个描述符是可以重用的。这里不多说。如果用图形来表示这个概念,应该是这样的:我们可以看到不同的数字代表不同的文件。那么我在哪里可以列出一个进程打开的文件呢?在linux下,可以先找到这个进程的PID,假设是20000,进入如下目录:cd/proc/20000/fdcopycode这个目录存放的是20000进程打开的文件,ls看一下,如图:正如我所描述的,都是数字。一些约定俗成的描述符从上图可以看出,描述符是从0开始的。那么什么文件是0呢?在Linux下,每个进程启动时,默认会打开三个文件,分别使用0、1、2作为它们的描述符。那么0、1、2分别代表哪三个文件呢?0:代表标准输入1:代表标准输出2:代表错误输出可能上面的描述不够清楚。更进一步,一般来说,标准输入是指键盘输入和标准输出,标准输出是指输出到屏幕的错误输出,也指的是输出到屏幕文件描述符的作用。如果你在Linux下写过一个读取键盘输入的程序,那么就这样理解吧。你读到的其实是描述符0所代表的文件内容:也就是键盘。如果你使用了print之类的函数来打印日志,那么内容实际上是输出到描述符1所代表的文件中。是的,内容显示在屏幕上。其实这个读写操作对于所有的文件都是一样的,至少在用法上是这样的。都是先打开一个文件,给他一个描述符,然后对这个描述符进行读写操作。文件与键盘输入的关系键盘输入的操作在Linux中会变成对文件的操作,就像普通的文件一样。Linux就是这样设计的,一切都是文件。不仅键盘操作和丝网打印都是文件操作。通过网络连接读取数据也是文件操作,这些也会产生文件描述符。一个进程同时拥有的文件描述符是有上限的,这个上限是可以设置的。不信你可以试试同时打开10000个文件,看看会不会报错。如果报告错误,请观察报告的是什么错误。可能是这样的错误:toomanyopenedfiles将代码复制回pipelineoperator|cat系统日志|grephello复制代码现在让我们描述一下上面的整个命令:catsystem.logcat程序打开system.log文件,并将system.log的内容写入文件1,也就是屏幕上。grephellogrep这个程序试图从文件0中读取数据,然后找到包含hello的行,然后将找到的行写入文件1中,即屏幕上管道的作用是将前面的1进行转换program绑定到后一个程序的0。所以,要整体走一遍,否则,cat的结果会打印到屏幕上,而不是给grep。最后,如果您觉得这篇文章对您有点帮助,请点个赞。或者可以加入我的开发交流群:1025263163互相学习,我们会有专业的技术解答。如果您觉得这篇文章对您有用,请给我们的开源项目一个小星星:http://github。crmeb.net/u/defu非常感谢!完整源码下载地址:https://market.cloud.tencent....PHP学习手册:https://doc.crmeb.com技术交流论坛:https://q.crmeb.com
