0

0

Linux 管道操作符详解

蓮花仙者

蓮花仙者

发布时间:2025-07-20 13:10:11

|

256人浏览过

|

来源于php中文网

原创

管道操作符 : |

我们在linux下经常要用到管道操作符,也就是"|",即一个竖线。这个操作符的作用对于经常使用linux的人来说,看上去十分直观:

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

举个例子:

代码语言:javascript代码运行次数:0运行复制
cat system.log | grep hello复制代码

上面的指令可以让我们过滤出system.log这个文件中包含hello字符串的行,然后打印到屏幕上。

什么叫指令的结果

问题就来了,一个指令的结果是什么,这个说法十分混淆。

是指这个指令输出的日志?是指这个指令的返回码?(有些人可能不知道这东西)还是指啥啥啥的?

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

如何描述 cat 指令的行为

首先我们来看一下 cat system.log 这个指令的行为。

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

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

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

程序打开文件以及文件描述符

在 Linux 系统中,一个程序是可以打开一个文件的,这个很容易理解。

那么进程(一般正在运行的程序称之为进程)是如何管理文件的呢?

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

一个进程打开一个文件,就会创建一个新的文件描述符,这个数字一般是自增的。比如说,当前的文件描述符是100。那么再打开一个新的文件,这个新的文件的描述符就是101。当然进程如果关闭文件,这个描述符是可以重复利用的。这里不多扯。

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

Linux 管道操作符详解

我们可以看出,不同的数字代表了不同的文件。

那么在哪里能列出一个进程所打开的文件呢?

在Linux下,可以先找到这个进程的PID,假设是 20000

进入如下的目录:

代码语言:javascript代码运行次数:0运行复制
cd /proc/20000/fd复制代码

这个目录存放的就是 20000 这个进程所打开的文件了。ls一下,如图:

亿众购物系统
亿众购物系统

一套设计完善、高效的web商城解决方案,独有SQL注入防范、对非法操作者锁定IP及记录功能,完整详细的记录了非法操作情况,管理员可以随时查看网站安全日志以及解除系统自动锁定的IP等前台简介:  1)系统为会员制购物,无限会员级别。  2)会员自动升级、相应级别所享有的折扣不同。  3)产品可在缺货时自动隐藏。  4)自动统计所有分类中商品数量,并在商品分类后面显示。  5)邮件列表功能,可在线订阅

下载
Linux 管道操作符详解

正如我所描述的那样,都是数字。

一些约定俗成的描述符

从上面的图中,我们看到,描述符是从0开始的。那么0是什么文件呢?

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

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

0 : 代表标准输入1 : 代表标准输出2 : 代表错误输出

也许上面的描述,还是不够清晰。

再进一步,一般来说,

标准输入,就是指 键盘输入标准输出,就是指输出到屏幕错误输出,也是指输出到屏幕文件描述符的作用

如果你在Linux下,写过读取键盘输入的程序,那么就这样理解。

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

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

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

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

文件和键盘输入的关系

键盘输入这种操作,在Linux里,会变成一个文件操作,就类似普通的文件那样。这就是Linux的设计,一切皆是文件。不仅仅键盘操作屏幕打印是文件操作。网络连接读取数据啥的,也都是文件操作,这些也都会产生文件描述符。一个进程同时拥有的文件描述符是有上限的,这个上限可以设置。如果你不信,你可以试试同时打开一万个文件,看看会不会报错,如果报错,观察一下是报的什么错。

可能是这样的错误:

代码语言:javascript代码运行次数:0运行复制
too many opened files复制代码
回到管道操作符 |代码语言:javascript代码运行次数:0运行复制
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

最后

完整源码下载地址:https://market.cloud.tencent.com/products/33396

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

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

554

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

732

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

657

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号