当前位置: 首页 > news >正文

Shell高级——进程替换vs管道

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。

1、问题引入 

这里将Shell中的“进程替换”与“管道”放在一起讲,是因为两者的作用几乎类似。

进程替换:将一个命令的输出结果传递给另一个(组)命令。

管道:将两个或者多个命令连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道。

它们都是将一个命令的输出传递给另一个命令,那么它们有什么区别呢?

我们首先看一个使用管道的例子。

xjh@ubuntu:~/iot/tmp$ echo "http://c.biancheng.net/shell/" | read
xjh@ubuntu:~/iot/tmp$ echo $REPLYxjh@ubuntu:~/iot/tmp$ 

以上代码输出结果总是为空,因为 echo $REPLY 命令在父 Shell 中执行,而 read 命令在子 Shell 中执行,当 read 执行结束时,子 Shell 被销毁,REPLY 变量也就消失了。

管道中的命令总是在子 Shell 中执行的,任何给变量赋值的命令都会遭遇到这个问题。

使用read读取数据时,如果没有提供变量名,则读取到的数据将存放到环境变量 REPLY中。

 

2、进程替换

Shell 的“进程替换”可以用来解决这种麻烦。Shell 进程替换有两种写法:

一种用来产生标准输出,借助输入重定向,它的输出结果可以作为另一个命令的输入:

<(commands)

另一种用来接受标准输入,借助输出重定向,它可以接收另一个命令的输出结果:

>(commands)

其中commands可以是命令列表,命令之间用分号隔开,另外<>与圆括号之间是没有空格的。

【1】例如,为了解决上面遇到的问题,我们可以像下面这样使用进程替换:

read < <(echo "http://c.biancheng.net/shell/")
echo $REPLY

整体上来看,Shell 把echo "http://c.biancheng.net/shell/"的输出结果作为 read 的输入。<()用来捕获 echo 命令的输出结果,<用来将该结果重定向到 read。

注意,两个<之间是有空格的,第一个<表示输入重定向,第二个<()连在一起表示进程替换。

本例中的 read 命令和第二个 echo 命令都在当前 Shell 进程中运行,读取的数据也会保存到当前进程的 REPLY 变量,大家都在一个进程中,所以使用 echo 能够成功输出。

而在前面的例子中我们使用了管道,echo 命令在父进程中运行,read 命令在子进程中运行,读取的数据也保存在子进程的 REPLY 变量中,echo 命令和 REPLY 变量不在一个进程中,而子进程的环境变量对父进程是不可见的,所以读取失败。

【2】再来看一个进程替换用作“接受标准输入”的例子。因为使用了重定向,read 命令从echo "C语言中文网"的输出结果中读取数据。

xjh@ubuntu:~/iot/tmp$ echo "C语言中文网" > >(read; echo "你好,$REPLY")
xjh@ubuntu:~/iot/tmp$ 你好,C语言中文网xjh@ubuntu:~/iot/tmp$

 

3、进程替换的本质

为了能够在不同进程之间传递数据,实际上进程替换会跟系统中的文件关联起来(也就是让某个文件当做中间者),这个文件的名字为/dev/fd/n(n 是一个整数)。该文件会作为参数传递给()中的命令,()中的命令对该文件是读取还是写入取决于进程替换格式是<还是>

(1)如果是>(),那么该文件会给()中的命令提供输入;借助输出重定向,要输入的内容可以从其它命令而来。

(2)如果是<(),那么该文件会接收()中命令的输出结果;借助输入重定向,可以将该文件的内容作为其它命令的输入。

使用 echo 命令可以查看进程替换对应的文件名:

xjh@ubuntu:~/iot/tmp$ echo >(true)
/dev/fd/63
xjh@ubuntu:~/iot/tmp$ echo <(true)
/dev/fd/63
xjh@ubuntu:~/iot/tmp$ echo >(true) <(true)
/dev/fd/63 /dev/fd/62
xjh@ubuntu:~/iot/tmp$ 

/dev/fd/目录下有很多序号文件,进程替换一般用的是 63 号文件,该文件是系统内部文件,我们一般查看不到。

我们通过下面的语句进行实例分析:

echo "shellscript" > >(read; echo "hello, $REPLY")

第一个>表示输出重定向,它把第一个 echo 命令的输出结果重定向到/dev/fd/63文件中。

>()中的第一个命令是 read,它需要从标准输入中读取数据,此时就用/dev/fd/63作为输入文件,把该文件的内容交给 read 命令,接着使用 echo 命令输出 read 读取到的内容。

可以看到,/dev/fd/63文件起到了数据中转或者数据桥梁的作用,借助重定向,它将>()内部的命令和外部的命令联系起来,使得数据能够在这些命令之间流通。

 

相关文章:

Shell高级——进程替换vs管道

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权请告知删除。 1、问题引入 这里将Shell中的“进程替换”与“管道”放在一起讲&#xff0c;是因为两者的作用几乎类似。 进程替换&#xff1a;将一个命令的输出结果传递给另一个&#xff08;组&#xff09;命令。 管…...

国内有哪些支持定制化的低代码平台?

编者按&#xff1a;贴合企业业务需求的系统才是好系统&#xff0c;高程度的定制能力平台意味着可以提供更高契合度的产品&#xff0c;更好地匹配业务需求。本文介绍了国内支持定制化的老厂商低代码平台&#xff0c;具有源码交付、私有化部署、国产化、数据对接等优势。关键词&a…...

Altair 宣布将于3月举办 Future.Industry 2023 全球虚拟大会

Altair&#xff08;纳斯达克股票代码&#xff1a;ALTR&#xff09;近日宣布将于 2023 年 3 月 8 - 9 日 举办年度全球虚拟大会 Future.Industry 2023。旨在探索影响全球未来的新趋势&#xff0c;并深入探讨仿真、高性能计算 (HPC)、人工智能&#xff08;AI&#xff09;和数据分…...

react lazyLoad学习记录

react lazyLoad学习记录1.lazyLoad用处2.使用2.1 react-router-dom5版本写法2.2 react-router-dom6版本写法1.lazyLoad用处 默认例如首页&#xff0c;如果有好十几个甚至百个路由&#xff0c;react是会默认一下全部把路由组件一下全部加载的&#xff0c;极可能造成页面卡顿。r…...

29 openEuler管理网络-配置网络绑定

文章目录29 openEuler管理网络-配置网络绑定29.1 使用nmcli29.2 使用命令行29.2.1 检查是否已安装Bonding内核模块29.2.2 创建频道绑定接口29.2.3 创建从属接口29.2.4 激活频道绑定29.2.5 创建多个绑定29 openEuler管理网络-配置网络绑定 29.1 使用nmcli 创建名为bond0的绑定&…...

RTT 全志D1s RDC2022纪念版开发板开箱使用分享与折腾记录

原文链接&#xff1a;https://bbs.aw-ol.com/topic/3021/ 作者caoxuetian 1&#xff1a;开发板介绍 RTT D1s RDC2022纪念版开发板是一块基于全志科技RISC-V内核 芯片 D1S的小尺寸开发板&#xff0c;尺寸仅为5.5cm*4cm&#xff0c;能够已非常小的体积带来舒适的开发感受&#…...

24日常实习万得一面面径

文章目录分析与复盘面试题分析与复盘 应该将项目进行复习好的&#xff0c;两个项目都应该对简历写的那些进行复习&#xff0c;以为日常不问项目的一面。哭死… 面试题 1.自我介绍 2.为什么从土木转到开发&#xff0c;学习java有哪些途径 3.介绍下项目中你觉得最有设计的模…...

MySQL的DML和DDL操作(1)

这里介绍几种DML操作INSERT INTO——插入记录插入一条记录插入一条记录 INSERT INTO table [(column [, column . ])] VALUES(value [,value . ]); 例子&#xff1a; insert into student values( 1,"承太郎" )default charset utf8&#xff1b;插入多条记录插入多条…...

Kafka系列之:Kafka生产者和消费者

Kafka系列之:Kafka生产者和消费者 一、Kafka生产者发送流程二、提高生产者吞吐量三、Kafka消费方式四、Kafka消费者总体工作流程五、按照时间消费Kafka Topic一、Kafka生产者发送流程 batch.size:只有数据积累到batch.size之后,sender才会发送数据,默认16K。linger.ms:如果…...

Linux进程间通信:信号量(一)

前提知识 在介绍信号量之前&#xff0c;先来看看一些概念和一些简单的前提知识&#xff1a; 进程间通信的前提是让不同的进程看到同一份资源。于是&#xff0c;就有提出让这种资源成为一种公共资源的方法&#xff0c;方法的提出&#xff0c;导致了一种新的问题的出现&#xf…...

Python笔记一之excel的读取

这里我常用的 python 对于 excel 的读取库有两个&#xff0c;一个是 xlsxwriter 用于操作 excel 的写入&#xff0c;一个是 xlrd 用于 excel 文件的读取。 使用的库的版本如下&#xff1a; xlsx1.2.6xlrd1.1.0 xlsxwriter 写入 excel 新建一个 excel import xlsxwriterpat…...

JavaScript Number 数字对象

文章目录JavaScript Number 数字对象JavaScript 数字所有 JavaScript 数字均为 64 位精度八进制和十六进制无穷大&#xff08;Infinity&#xff09;NaN - 非数字值数字可以是数字或者对象数字属性数字方法JavaScript Number 数字对象 JavaScript 只有一种数字类型。 可以使用也…...

设计模式-服务定位器模式

设计模式-服务定位器模式一、背景1.1 服务定位模式1.2 策略模式二、代码实战2.1 服务定位器2.2 配置ServiceLocatorFactoryBean2.3 定义一个支付的接口2.4 根据不同类型处理Bean2.5 controller层三、项目结构及测试结果3.1 测试结果3.2 项目结构及源码(欢迎star)四、参考资料一…...

Android Dalvik虚拟机 GC流程分析

前言 本篇继续介绍安卓dalvik虚拟机&#xff0c;介绍Dalvik虚拟技的GC流程。 GC结构体 dalvik/vm/alloc/Heap.h static const GcSpec kGcForMallocSpec {true, /* isPartial */false, /* isConcurrent */true, /* doPreserve */"GC_FOR_ALLOC" }; /* Not eno…...

opencv读入图片注意事项

来源&#xff1a;投稿 作者&#xff1a;蓬蓬奇 编辑&#xff1a;学姐 深度学习数据预处理中常用opencv读入图片&#xff0c;一般在__getitem__函数中调用。本文主要介绍opencv读取图片的一些细节以及注意事项。本文中使用的图片见第6节“opencv测试使用的图片”。 1.如何通过o…...

学习渗透测试,考CISP-PTE还是考NISP-PT证书呢?

其实两者都可以&#xff0c;但是要看考生的实际需求&#xff01; 为什么说两者都可以&#xff1f; 两个证书都由中国信息安全测评中心颁发&#xff0c;CISP-PTE&#xff08;注册信息安全渗透测试工程师&#xff09;,NISP-PT&#xff08;国家信息安全水平考试渗透测试工程师),…...

记录自己遇到的关于Hashmap的面试题

一.麻烦讲述一下Hashmap的扩容原理 jdk1.8中的hashmap扩容原理 1.put流程图 首先贴一张图(图片来源于传送门&#xff09;&#xff0c;多谢大佬的美图&#xff0c;此图已经完美的描述了put的整个流程&#xff0c;我也就不想自己画了&#xff0c;嘿嘿: 2.hashmap中几个比较重…...

mysql数据库之sql语句性能分析工具

一、sql执行频率。 mysql客户端连接成功后&#xff0c;通过show [session | global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的INSERT/UPDATE/DELETE的访问频次。 #一个下划线代表一个字符 show global status like com_; 二、慢查…...

搭建SpringBoot项目

文章目录前言准备工具创建项目前言 为什么使用SpringBoot?它有什么好处&#xff1f; SpringBoot可以快速构建出独立的Spring应用&#xff0c;简化了配置文件。内嵌Tomcat服务器&#xff0c;无须手动部署war文件。 准备工具 idea2022navicat16postmanjdk1.8 创建项目 File-&…...

“一网统管”视频融合平台EasyCVR页面tab切换细节优化

EasyCVR视频融合平台基于云边端协同架构&#xff0c;能支持海量视频的轻量化接入与汇聚管理&#xff0c;借助大数据分析的决策判断&#xff0c;为网络摄像头、网络存储设备、智能终端、无人机、车载设备、移动执法仪、视频监控平台等提供一体化的视频接入、分发、存储、处理等能…...

Python 爬虫进阶技巧:定时爬虫任务实现无人值守采集

前言 常规爬虫多依赖手动触发脚本运行,单次采集完成后需人工二次启动,无法满足日常周期性数据监控、行情抓取、资讯同步、业务台账定时归档等常态化采集需求。搭建可自主调度、自动启停、周期循环的定时爬虫任务,脱离人工干预实现无人值守全自动采集,是爬虫从临时脚本走向…...

扣图操作方法完全指南:一键去背景,从小白到高手只需3步

每次看到朋友圈里别人的证件照、商品图、头像背景都换得很专业&#xff0c;你是不是也想试试&#xff1f;但一提到"扣图"&#xff0c;很多人的第一反应就是打开Photoshop&#xff0c;结果被复杂的工具栏劝退了。其实&#xff0c;现在扣图已经不是什么高技术门槛的事儿…...

暗黑破坏神4 2026.5.13最新破解版免费下载 (速下 随时失效)手机电脑版通用

下载链接 圣休亚瑞的暗影演进&#xff1a;探析《暗黑破坏神4》的设计、玩法与竞争格局 作为动作角色扮演游戏&#xff08;ARPG&#xff09;领域的常青树&#xff0c;暴雪娱乐&#xff08;Blizzard Entertainment&#xff09;开发的《暗黑破坏神4》&#xff08;以下简称D4&…...

【Pixel专属Gemini Edge推理引擎】:本地运行LLM不联网、零延迟、功耗降低47%——实测数据首次公开

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Edge推理引擎的Pixel专属定位与技术边界 Gemini Edge 是 Google 为 Pixel 系列设备深度定制的端侧推理引擎&#xff0c;其核心设计目标并非通用模型部署&#xff0c;而是围绕 Pixel 的硬件协同栈…...

2025终极指南:Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能

2025终极指南&#xff1a;Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Yo…...

Spring Boot 3.x 集成AD域实战:从SSL证书踩坑到密码重置,一篇讲透

Spring Boot 3.x 深度集成AD域实战&#xff1a;SSL证书配置与密码策略避坑指南 在企业级应用开发中&#xff0c;Active Directory&#xff08;AD&#xff09;集成是身份认证的核心环节。本文将带您深入Spring Boot 3.x与AD域集成的实战细节&#xff0c;特别聚焦于SSL证书配置和…...

openclaw gateway网关运行详解

&#x1f4d8; Gateway 网关运行手册 — 关键内容与操作流程 1) Gateway 是什么 Gateway 网关服务 是一款长期运行的进程&#xff0c;用于处理连接控制、事件平面&#xff0c;与底层 Baileys / Telegram 等协议对接&#xff0c;为客户端提供 RPC/HTTP 接口。它自身启动后持续运…...

怎么查询MongoDB中只包含特定键的文档_对象精确匹配的陷阱

...

2026年,想找A研发公司?这些关键选择要点你不可不知!

在科技飞速发展的2026年&#xff0c;AI技术已经广泛应用于各个领域&#xff0c;众多企业都希望借助AI研发公司的力量来提升自身竞争力。然而&#xff0c;面对市场上众多的AI研发公司&#xff0c;如何做出正确的选择成为了一大难题。下面就为大家介绍一些选择AI研发公司的关键要…...

PyTorch/TensorFlow深度学习环境搭建:在Windows10上一步到位搞定CUDA和cuDNN(避坑合集)

PyTorch/TensorFlow深度学习环境搭建&#xff1a;在Windows10上一步到位搞定CUDA和cuDNN&#xff08;避坑合集&#xff09; 刚入坑深度学习的开发者&#xff0c;最头疼的莫过于环境配置。明明按照教程一步步安装了PyTorch或TensorFlow&#xff0c;却在代码运行时看到CUDA不可用…...