Linux 管道操作符详解

article/2025/9/23 2:29:32

管道操作符 : |
我们在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.com/products/33396

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


http://chatgpt.dhexx.cn/article/pcqoodum.shtml

相关文章

linux之管道符详解

linux之管道符 ’ | ’ 操作详解 管道符主要用于多重命令处理,前面命令的打印结果作为后面命令的输入。简单点说就是,就像工厂的流水线一样,进行完一道工序后,继续传送给下一道工序处理… 举个栗子:对hello.sh文件进行…

【Linux】Linux的管道

管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的…

【Linux】管道

前言 我和前桌上课传纸条,这是一种通信方式。 而我们为什么能过在上课的时候通信? 因为我们通过在纸条上写字进行了数据的传递。 本质上而言,我们两个都能看见一份公共的资源并对其进行读写,那就是小纸条! 进程间通信的本质&a…

【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例

目录 管道1. 管道通信1.1 通信模式1.2 管道通信中特殊的名词 2. 无名管道(PIPE)2.1 无名管道的通信原理2.2 无名管道特点2.3 如何操作无名管道示例1示例2 3. 有名管道(FIFO)3.1 有名管道的特点3.2 如何操作有名管道 4. 示例4.1 cu…

linux命令管道工作原理与使用方法

一、管道定义 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点: *** 数据只能由一个进程流向另一个进程…

Linux管道

目录 1.管道概念 2.管道分类 1.匿名管道 1.基本实现与概念 2.站在文件描述符角度-深度理解管道 3.站在内核角度-管道本质 4.管道读写规则 5.管道属性设置与阻塞验证 6.管道特点(匿名) 2.命名管道 1.创建一个命名管道 2.命名管道的打开规则 3.匿名管道与命名管道的区别…

linux中管道的概念,浅谈Linux管道

通过前面的学习,我们已经知道了怎样从文件重定向输入,以及重定向输出到文件。Shell 还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,…

linux管道举例理解

linux管道举例理解 一、管道的定义:“|”二、查找2.1统计当前目录下有多少个文件2.2查看当前目录下的前n(3)个文件2.3查看wang.txt文件包含i的字符行2.4查看内存使用情况2.5查询进程 三、更改 https://blog.csdn.net/hanhanwanghaha宝藏女孩 …

图解YUV格式

YUV格式有两大类:planar和packed。 对于planar的YUV格式,Y,U,V都是连续存放的,比如 YYYYUUUUVVVV 对于packed的YUV格式,每个像素点的Y,U,V是连续交替存储的。 RGB24,BGR24等等都是packed方式存…

走进音视频的世界——RGB与YUV格式

在图像的世界里,一般使用RGB作为存储格式。而在视频的世界里,一般使用YUV作为压缩存储格式。有时候面试官会问:为什么视频使用YUV来压缩存储,而不用RGB?YUV与RGB有什么区别,两者如何转换的?常见…

YUV格式像素

一幅彩色图像的基本要素是什么? 说白了,一幅图像包括的基本东西就是二进制数据,其容量大小实质即为二进制数据的多少。一幅1920x1080像素的YUV422的图像,大小是1920X1080X24147200(十进制),也就…

查看YUV格式文件

RGB图片文件转换为YUV格式后&#xff0c;将YUV数据以二进制形式写到文件中&#xff0c;使用7yuv软件查看。 #include<iostream> #include<cstdio> #include<string> #include"opencv2/opencv.hpp"#include "libyuv/scale.h" #include &…

详解YUV数据格式

在博客园看到有大神写了一篇关于YUV图像格式的博客&#xff0c;图文分析很不错&#xff0c;这里就转载过来了。但排版有些乱&#xff0c;所以我就在原博文的基础上做了一些排版&#xff0c;修改 了一些错误。希望我们能共同进步。come on&#xff01;&#xff01; 一.YUV数据…

YUV格式的图片查看工具YUView 2.13

YUV格式的图片查看工具YUView 2.13 参考资料&#xff1a; Image to YUV (ffmpeg/ImageMagick) 这2个工具可用于音视频格式转换等处理 Image to YUV (ffmpeg/ImageMagick)_hushui的博客-CSDN博客 FFmpeg常用命令/参数 https://blog.csdn.net/weixin_36811328/article/details/88…

YUV文件格式

原文&#xff1a;YUV图像格式的博客 转&#xff1a;https://blog.csdn.net/armwind/article/details/52190123&#xff0c;文章不错特转载过来备忘 一.YUV数据格式的定义和采集方式 1&#xff09;YUV数据格式定义 YUV分为三个分量&#xff0c;“Y”表示明亮度&#xff08;Lu…

关于YUV格式的一些总结

关于YUV格式的一些总结 一、YUV和YCbCr1、定义2、区别和联系 二、不同的采样格式1、YUV4442、YUV4403、YUV4224、YUV4205、YUV4116、YUV410 三、YUV数据排列格式1、四种数据排列方式①Planar Format②Semi-Planar Format③Tiled Semi-Planar Format④Interleaved Format 2、常用…

音视频基础之YUV格式

1 YUV格式 1.1 YUV简介 YUV是一种颜色编码方式&#xff0c;类似于RGB颜色编码方式。YUV将亮度和色度分离&#xff0c;使用Y&#xff08;明亮度&#xff09;、U和V&#xff08;色度、浓度&#xff09;三个分量表示一个颜色。三个分量中UV分量只有颜色信息&#xff0c;如果图像只…

YUV格式与RGB格式

YUV与RGB格式介绍 一、RGB编码格式二、YUV编码格式YUV存储格式&#xff08;分类&#xff09;&#xff1a;YUV采样方式&#xff1a;常见的YUV格式 三、RGB与YUV转换公式 一、RGB编码格式 RGB图像具有三个通道 R、G、B&#xff0c;分别对应红、绿、蓝三个分量&#xff0c;由三个…

YUV数据格式介绍

YUV图像数据格式介绍 1.yuv格式的分类和介绍 2.YUV三个分量的代表含义 Y分量&#xff1a;表示明亮度&#xff08;Luma&#xff09;即灰度值 UY分量&#xff1a;表示色彩和饱和度即图片的颜色 U颜色代表 blue Y 颜色代表red YUV从形式上也可以用YCbCr 表示 3.常见的YUV格式…

YUV 格式详解-史上最全

YUV 格式详解 介绍分类标准具体分类I420&#xff08;属于 YUV 420 Plannar&#xff09;YV12&#xff08;属于 YUV 420 Plannar&#xff09;NV12&#xff08;属于 YUV 420 Semi-Planar&#xff09;NV21&#xff08;属于 YUV 420 Semi-Planar&#xff09;I422&#xff08;属于 YU…