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(管道):

  • 管道是同步执行

  • cat 和 while 在同一管道中顺序执行

  • 整个管道完成后才返回

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)临时文件。仅此而已。

相关推荐
普通人62 小时前
CSS-box-sizing-使用指南
开发语言·前端·css·1024程序员节
女神下凡2 小时前
芯参谋(83):AliOS Things_驱动开发指南
arm开发·驱动开发·单片机·嵌入式硬件·设计规范·1024程序员节
鬼手点金2 小时前
Skills:领域能力的可组合单元
java·人工智能·笔记·自动化·1024程序员节
总要学点什么12 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
喵了几个咪14 小时前
AI 时代的危与机:当潮水退去,技术人如何自处
1024程序员节
LMT流氓兔16 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
开开心心就好17 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
开开心心就好20 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
郝学胜-神的一滴1 天前
AI 编程智能体 20:技术栈选型与架构落地全攻略
人工智能·python·架构·langchain·1024程序员节·智能体
xsd202411182 天前
RelateAnything:53M小模型如何把视觉关系检测从50个谓词里解放出来
人工智能·1024程序员节