Linux中的管道

管道

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

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

匿名管道 |

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

匿名管道不是文件系统中的一个持久化对象(没有文件名)。它是在内存中创建的一个缓冲区,通过 pipe() 系统调用返回两个文件描述符:一个用于读取(fd[0]),一个用于写入(fd[1])。这两个文件描述符只存在于父进程的文件描述符表中。当父进程调用 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  │
                         └─────────────┘
相关推荐
17(无规则自律)7 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
liu****7 小时前
2.深入浅出理解虚拟化与容器化(含Docker实操全解析)
运维·c++·docker·容器·虚拟化技术
中二病码农不会遇见C++学姐7 小时前
Linux下的.run文件
linux
予枫的编程笔记7 小时前
【Linux入门篇】摆脱权限混乱困境:Linux用户组管理+sudo提权,一步到位
linux·linux运维·后端开发·linux用户管理·linux权限配置·chmod命令·sudo配置
starfire_hit7 小时前
JAVAWEB根据前台请求获取用户IP
java·服务器·网络
一个人旅程~7 小时前
Dell n4020双系统分区步骤和linux优化操作
linux·windows·电脑
池央7 小时前
CANN 诊断工具链深度解析:oam-tools 的自动化故障信息收集、软硬件状态快照与 AI Core 错误溯源机制
运维·人工智能·自动化
忆~遂愿7 小时前
CANN metadef 深度解析:动态形状元数据管理、图编译器接口规范与序列化执行机制
大数据·linux
予枫的编程笔记7 小时前
【Linux入门篇】Linux文件操作不用记满屏命令,掌握touch/cp/mv核心用法就够了
linux·tar·linux命令·tail·cat·linux文件管理·linux新手教程
learning-striving8 小时前
kali连不上网解决方法
linux·开发语言·网络·php·kali