关于linux:Linux-管道操作符详解

51次阅读

共计 1962 个字符,预计需要花费 5 分钟才能阅读完成。

管道操作符 : |
咱们在 Linux 下常常要用到管道操作符,也就是 ”|”,即一个竖线。
这个操作符的作用对于常常应用 Linux 的人来说,看上去非常直观:

不就是将前一个指令的后果交给后一个指令吗?

举个例子:

cat system.log | grep hello
复制代码

下面的指令能够让咱们过滤出 system.log 这个文件中蕴含 hello 字符串的行,而后打印到屏幕上。

什么叫指令的后果
问题就来了,一个指令的后果是什么,这个说法非常混同。

是指这个指令输入的日志?
是指这个指令的返回码?(有些人可能不晓得这货色)
还是指啥啥啥的?

实际上,指令的后果这个概念并没有一个严格定义,所以当咱们说,一个指令的后果的时候,常常跟业务场景有关系。比如说,一个图像处理程序的后果,就应该是一个图像,这才是合乎常理的。

如何形容 cat 指令的行为
首先咱们来看一下 cat system.log 这个指令的行为。

也就是将 system.log 中的内容打印到屏幕上。

这个过程能够细说,因为将内容打印到屏幕上实际上还是不够精确。

那么这里就不得不牵扯出 Linux 下文件的一些概念。

程序关上文件以及文件描述符
在 Linux 零碎中,一个程序是能够关上一个文件的,这个很容易了解。

那么过程 (个别正在运行的程序称之为过程) 是如何管理文件的呢?

那就是用文件描述符这种货色,这是一个数字以及与之相关联的一堆数据。

一个过程关上一个文件,就会创立一个新的文件描述符,这个数字个别是自增的。比如说,以后的文件描述符是 100。那么再关上一个新的文件,这个新的文件的描述符就是 101。当然过程如果敞开文件,这个描述符是能够反复利用的。这里不多扯。

如果用图来示意这个概念,应该是上面的样子:

咱们能够看出,不同的数字代表了不同的文件。

那么在哪里能列出一个过程所关上的文件呢?

在 Linux 下,能够先找到这个过程的 PID,假如是 20000

进入如下的目录:

cd /proc/20000/fd
复制代码

这个目录寄存的就是 20000 这个过程所关上的文件了。ls 一下,如图:

正如我所形容的那样,都是数字。

一些约定俗成的描述符
从下面的图中,咱们看到,描述符是从 0 开始的。
那么 0 是什么文件呢?

在 Linux 下,每一个过程启动的时候,都会默认关上三个文件,用 0 ,1, 2 来当做他们的描述符。

那么 0, 1, 2 别离代表哪三个文件呢?

0:代表规范输出
1:代表规范输入
2:代表谬误输入
兴许下面的形容,还是不够清晰。

再进一步,一般来说,

规范输出,就是指 键盘输入
规范输入,就是指输入到屏幕
谬误输入,也是指输入到屏幕
文件描述符的作用
如果你在 Linux 下,写过读取键盘输入的程序,那么就这样了解。

你读取的其实就是 0 这个描述符所代表的文件的内容:也就是键盘。

如果你应用过相似 print 这种函数,打印过日志的话,那么其实就是往 1 这个描述符所代表的文件里输入内容,对,这个内容通过屏幕展示进去了。

实际上,这种读取和写入的操作,对于所有文件来说都是一样的,至多在应用上来说,是一样的。

都是先关上一个文件,给他一个描述符,而后针对这个描述符进行读或者写。

文件和键盘输入的关系
键盘输入这种操作,在 Linux 里,会变成一个文件操作,就相似一般的文件那样。
这就是 Linux 的设计,所有皆是文件。不仅仅键盘操作和屏幕打印是文件操作。
网络连接读取数据啥的,也都是文件操作,这些也都会产生文件描述符。
一个过程同时领有的文件描述符是有下限的,这个下限能够设置。
如果你不信,你能够试试同时关上一万个文件,看看会不会报错,如果报错,察看一下是报的什么错。

可能是这样的谬误:

too many opened files
复制代码
回到管道操作符 |
cat system.log | grep hello
复制代码
咱们当初再来形容下面整个指令:

  1. cat system.log
    cat 这个程序关上了 system.log 这个文件,将 system.log 的内容,写入 1 这个文件,也就是屏幕上。
  2. grep hello
    grep 这个程序,试图从 0 这个文件中读取数据,而后找到蕴含 hello 的行,而后把找到的行,写入到 1 这个文件中,也就是屏幕上
  3. 管道的作用
    就是将前一个程序的 1 绑定到后一个程序的 0。

于是,整体才会走通,要不然,cat 的后果就会打印到屏幕,而不是给了 grep。

最初
如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163 互相学习,咱们会有业余的技术答疑解惑

如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star:http://github.crmeb.net/u/defu 不胜感激!

残缺源码下载地址:https://market.cloud.tencent….

PHP 学习手册:https://doc.crmeb.com
技术交换论坛:https://q.crmeb.com

正文完
 0