bash的“进程替换 + 重定向”和“传统管道”

命令1:进程替换 + 重定向:

cat test-comm > >(while read line; do echo "A"$line; done)

命令2:传统管道:

cat test-comm | while read line; do echo "A"$line; done

这俩有什么区别?

再说请这个问题前,需要先介绍一下什么是进程替换管道

进程替换的基本概念

进程替换 <(command) 会将命令的输出作为一个临时文件(实际上是命名管道)提供给另一个命令使用。

进程替换的优势

  1. 无需临时文件:不需要手动创建、管理、删除临时文件

  2. 更简洁:一行命令完成复杂操作

  3. 更安全:避免临时文件命名冲突或权限问题

  4. 性能更好:数据通过管道传递,不需要磁盘I/O

其他进程替换用法

除了 <(...) 用于读取,还有 >(...) 用于写入

POSIX 标准状态

  • <(...) 是 Bash/Zsh/Ksh 的扩展功能,不是 POSIX 标准

  • 在需要严格 POSIX 兼容的脚本中应避免使用

  • 可以使用临时文件或命名管道作为替代方案

  • 在实际脚本中可以通过特性检测来提供回退方案

Bash版本要求

  • 最低要求:Bash 2.04 或更高版本

  • 完全稳定:Bash 3.0 及以后版本支持得更好

"传统管道"和"进程替换 + 重定向"的区别

1. 执行时机和异步性

命令1(进程替换):

  • 进程替换 >(...) 在子shell中异步执行

  • cat 命令完成后,while循环可能还在运行

  • 整个命令立即返回,不等待while循环结束

命令2(管道):

  • 管道是同步执行

  • catwhile 在同一管道中顺序执行

  • 整个管道完成后才返回

2. 退出状态码

命令1:

bash 复制代码
cat test-comm > >(while read line; do echo "A"$line; done)
echo $?  # 只反映 cat 命令的退出状态,不反映while循环的状态

命令2:

bash 复制代码
cat test-comm | while read line; do echo "A"$line; done
echo $?  # 反映整个管道中最后一个命令的退出状态

3. 变量作用域

命令1:

bash 复制代码
# 在进程替换中设置的变量不会影响父shell
count=0
cat test-comm > >(while read line; do echo "A"$line; ((count++)); done)
echo "计数: $count"  # 输出: 计数: 0 (不会改变)

命令2:

bash 复制代码
# 在管道中设置的变量也不会影响父shell(管道也在子shell中运行)
count=0
cat test-comm | while read line; do echo "A"$line; ((count++)); done
echo "计数: $count"  # 输出: 计数: 0 (不会改变)

cat test-comm > >(command)和cat test-comm >(command)的区别

除了"传统管道"可以传递数据外,还有"重定向"也就是>符号。可以覆盖(>)或者追加(>>)数据到文件。这里的> >又是啥意思呢?

其实这里第一个>是重定向符号,第二个>是"进程替换"语法的一部分,也就是>(command)的一部分。平常我们对>(command)可以认为成一个临时文件即可。因为>(command) 创建一个临时文件名(通常是 /dev/fd/63 这样的文件描述符)。

cat test-comm > >(command)的含义是,读取test-comm的内容写入到后面的临时文件,也就是传递给>(command)中command去处理。

cat test-comm >(command)的含义是,读取test-comm文件和>(command)临时文件。仅此而已。

相关推荐
liguojun20253 天前
软硬一体智慧场馆系统推荐——助力场馆数字化高效升级
java·大数据·人工智能·物联网·1024程序员节
开开心心就好14 天前
吾爱大佬原创的文件时间修改工具
安全·智能手机·pdf·电脑·智能音箱·智能手表·1024程序员节
开开心心就好19 天前
近200个工具的电脑故障修复合集
安全·智能手机·pdf·电脑·consul·memcache·1024程序员节
数据皮皮侠AI21 天前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
计算机毕业论文辅导24 天前
物联网实战:基于MQTT协议的智能家居数据传输系统设计与实现
1024程序员节
开开心心就好24 天前
支持批量处理的视频分割工具推荐
安全·智能手机·rust·pdf·电脑·1024程序员节·lavarel
liuyao_xianhui1 个月前
Linux开发工具结尾 _make
linux·运维·服务器·数据结构·哈希算法·宽度优先·1024程序员节
学传打活1 个月前
【边打字.边学昆仑正义文化】_21_爱的结晶(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
数据皮皮侠AI1 个月前
顶刊同款!中国地级市风灾风险与损失数据集(2000-2022)|灾害 / 环境 / 经济研究必备
大数据·人工智能·笔记·能源·1024程序员节
Fab1an1 个月前
Busqueda——Hack The Box 靶机
linux·服务器·学习·1024程序员节