Linux中的管道

管道

bash 复制代码
command1 | command2 [ | command3 ... ]
ls -l | grep ".txt" # 列出当前目录下的文件,然后过滤出包含".txt"的行
ps aux | grep "nginx" # 查看所有进程,然后过滤出包含"nginx"的进程
  • 管道符|左边命令的输出会作为管道符右边命令的输入。
  • 可以串联多个管道,形成管道链。

在Linux中,管道(pipe)是一种进程间通信(IPC)的机制。本质上是内核在内存中维护的固定大小的缓冲区。 管道是半双工通信,先进先出。管道有两种类型:匿名管道(anonymous pipes)和命名管道(named pipes),在 shell 脚本和命令行操作中广泛应用。

匿名管道 |

匿名管道只能用于具有亲缘关系的进程(如父子进程)之间。

匿名管道不是文件系统中的一个持久化对象(没有文件名)。它是在内存中创建的一个缓冲区,通过 pipe() 系统调用返回两个文件描述符:一个用于读取(fd0),一个用于写入(fd1)。这两个文件描述符只存在于父进程的文件描述符表中。当父进程调用 fork() 创建子进程时,子进程会继承父进程的所有文件描述符的副本。这样,父子进程就拥有了指向同一个管道的文件描述符。

bash 复制代码
# 管道与重定向结合
command1 | command2 > output.txt
command1 < input.txt | command2 > output.txt

# 错误输出重定向
command1 2>&1 | command2

命名管道

如果需要在不相关的进程间进行管道通信,应该使用 命名管道(Named Pipe 或 FIFO)。命名管道在文件系统中有一个路径名(如 /tmp/myfifo)。任何知道该路径名的进程,都可以像操作普通文件一样,通过 open()、read()、write() 来访问它,从而实现了非亲缘进程间的通信。

bash 复制代码
echo "test data" | tee >(grep "test") >(wc -l)
复制代码
┌─────────────────────────────────────────────────────────────┐
│                   命令执行环境                               │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────┐
│   echo进程       │ 产生数据: "test data\n"
└─────────────────┘
         │
         ▼ 通过匿名管道传递
┌─────────────────┐
│   tee进程        │ 读取标准输入,复制到多个输出
└─────────────────┘
         │
         ├──────────────────┬───────────────────┐
         ▼                  ▼                   ▼
┌─────────────┐    ┌─────────────────┐    ┌─────────────┐
│ 标准输出     │    │ 进程替换输出1   │    │ 进程替换输出2 │
│ (终端)       │    │ /dev/fd/63     │    │ /dev/fd/64  │
└─────────────┘    └─────────────────┘    └─────────────┘
         │                  │                   │
         ▼                  ▼                   ▼
 显示: "test data"  ┌─────────────┐      ┌─────────────┐
                    │ grep进程    │      │ wc进程      │
                    │ 过滤"test"  │      │ 统计行数    │
                    └─────────────┘      └─────────────┘
                            │                   │
                            ▼                   ▼
                    输出: "test data"     输出: "1"
                            │                   │
                            └─────┬─────────────┘
                                  ▼
                         ┌─────────────┐
                         │   终端      │ ← 最终显示所有输出
                         │ 可能显示:   │
                         │ test data  │
                         │ 1          │
                         │ test data  │
                         └─────────────┘
相关推荐
IMPYLH1 分钟前
Linux 文件检索:find、locate、grep 与 which 实战指南
linux·运维·服务器
腾讯蓝鲸智云9 分钟前
【运维自动化-监控平台】如何配置进程监控之基于进程名规则匹配
运维·自动化·云计算·sass·paas
优化Henry11 分钟前
LTE基站传输割接后S1连接失败排查实录
运维·网络·笔记·学习·信息与通信
西索斯coding13 分钟前
Claude Code 工具调用返回空怎么办?claude-opus-5.5 的 input_schema 校验踩坑记录与修复方案
服务器·前端·javascript·ai
流烟默22 分钟前
ClickHouse Part 机制与写入优化实践指南
大数据·运维·clickhouse
剑锋所指,所向披靡!24 分钟前
Docker基础
运维·docker·容器
久曲健的测试窝31 分钟前
Testin云测探索脚本自愈落地路径
运维·人工智能·科技·aigc
奇树谦32 分钟前
本地FastDDS+远端MQTT转发(多主机数据隔离)架构设计与落地
运维·网络
小趴菜一只37 分钟前
SIEM-wazuh安装过程
运维·windows·安全·网络安全
脚踏实地,坚持不懈!1 小时前
Linux 内存回收机制:水位线、kswapd 与 Direct Reclaim
linux·jvm·算法