• 0.shell进程替换的用法
  • 1.使用进程替换的必要性
  • 2.进程替换的本质

进程替换和命令替换非常相似。命令替换是把一个命令的输出结果赋值给另一个变量,例如dir_files=`ls -l`date_time=$(date);而进程替换则是把一个命令的输出结果传递给另一个(组)命令

0.shell进程替换的用法

写法 含义 注意点 本质
<(commands)

它借助于输入重定向,可以将它的输出结果作为另一个命令的输入

commands 是一组命令列表,多个命令之间以分号;分隔。

注意,<>与圆括号之间是没有空格的

/dev/fd/n文件接受(commands)的输出,作为另一个命令的输入
>(commands)

它借助于输出重定向,可以接受另一个命令的标准输出结果

从/dev/fd/n文件中读取内容,作为(commands)的输入

1.使用进程替换的必要性

举栗
结果
说明

普通模式

  1. echo "aaaaa" | read AA
  2. echo $AA
输出结果为空

echo 命令在父 Shell 中执行,而 read 命令在子 Shell 中执行

当 read 执行结束时,子 Shell 被销毁,AA 变量也就消失了。

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

使用进程替换

  1. read AA< <(echo "aaaaa")
  2. echo $AA
输出结果为aaaaa

整体上来看,Shell 把echo "aaaaa"的输出结果作为 read 的输入。

<()用来捕获 echo 命令的输出结果,<用来将该结果重定向到 read。

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

read 命令和第二个 echo 命令都在当前 Shell 进程中运行

读取的数据也会保存到当前进程的 AA 变量,所以使用 echo 能够成功输出。

进程替换用作「接受标准输入」的例子

echo "qpy" > >(read; echo "你好,$REPLY")

运行结果:你好,qpy 因为使用了重定向,read 命令从echo "qpy"的输出结果中读取数据。

2.进程替换的本质

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

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

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

命令 输出 说明

echo >(true)

/dev/fd/63

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

/dev/fd/63文件起到了数据中转或者数据桥梁的作用,借助重定向,它将>()内部的命令和外部的命令联系起来,

使得数据能够在这些命令之间流通。

echo <(true)

/dev/fd/63

echo >(true) <(true)

/dev/fd/63 /dev/fd/62

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

hello, qpy

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

>()中的read命令从/dev/fd/63中读取内容,然后用echo 命令输出 read 读取到的内容。

 

23 shell 进程替换的更多相关文章

  1. Linux Shell编程(28)——进程替换

    进程替换与命令替换很相似. 命令替换把一个命令的结果赋给一个变量,例如 dir_contents=`ls -al`或xref=$. 进程替换则是把一个进程的输出回馈给另一个进程 (换句话说,它把一个命 ...

  2. Python3学习之路~2.8 文件操作实现简单的shell sed替换功能

    程序:实现简单的shell sed替换功能 #实现简单的shell sed替换功能,保存为file_sed.py #打开命令行输入python file_sed.py 我 Alex,回车后会把文件中的 ...

  3. 3-1 实现简单的shell sed替换功能

    1.需求 程序1: 实现简单的shell sed替换功能 file1 的内容copy到file2 输入参数./sed.py  $1  $2 $1替换成$2 (把a替换成% ) 2.个人思路 open ...

  4. Linux Shell参数替换

    Linux Shell参数替换 2013-06-03 10:01 by 轩脉刃, 1816 阅读, 0 评论, 收藏, 编辑 Bash中的符号的作用是参数替换,将参数名替换为参数所代表的值.对于 来说 ...

  5. 4.实现简单的shell sed替换功能

    # -*- coding:utf-8 -*- # Author: JACK ZHAO # 程序1: 实现简单的shell sed替换功能 import sys #判断参数个数 if len(sys.a ...

  6. Linux系统编程——进程替换:exec 函数族

    在 Windows 平台下,我们能够通过双击运行可运行程序,让这个可运行程序成为一个进程.而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是.假设我们本来就执行着一 ...

  7. python 3.x 写 shell sed 替换功能

    shell sed 替换功能 f1 = open('yesterday','r',encoding='utf-8') f2 = open('yesterday2','w',encoding='utf- ...

  8. Shell 命令替换

    1.命令替换,有两种方式 方式一:`command` 方式二:$(command) 2.应用场景 在命令中通过命令替换的方式,将某些子命令的结果嵌入到当前命令中. 3.举例 例1: 获取系统所用用户并 ...

  9. Python3.5 day3作业一:实现简单的shell sed替换功能

    需求: 1.使python具有shell中sed替换功能. #!/usr/bin/env python #_*_conding:utf-8_*_ #sys模块用于传递参数,os模块用于与系统交互. i ...

随机推荐

  1. linux进阶之Tomcat服务篇

    一.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomca ...

  2. VFB FEEDBACK

  3. 七牛云-上传、删除文件,工具类(Day49)

    要求: 1. java1.8以上 2. Maven: 这里的version指定了一个版本范围,每次更新pom.xml的时候会尝试去下载7.5.x版本中的最新版本,你可以手动指定一个固定的版本. < ...

  4. 从Lombok到JSR-269

    前言 Lombok的出现帮助开发人员在开发工程中消除了大部分冗余代码:繁琐的get.set方法甚至建造者模式. Lombok的实现方式是什么呢? 新建一个测试类使用Lombok的Getter和Sett ...

  5. Web应用漏洞-NGINX各类请求头缺失对应配置

    前言 随着越来越多的网络访问通过WEB界面进行操作,WEB安全已经成为互联网安全的一个热点,基于WEB的攻击广为流行,SQL注入.跨站脚本等WEB应用层漏洞的存在使得网站沦陷.页面篡改.网页挂马等攻击 ...

  6. 【排除解决】System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ 中发生一般性错误

    前言: 今天项目发布上线,发布到正式环境验证功能的时候忽然方向之前做的一个图片合成的功能报错了提示:System.Runtime.InteropServices.ExternalException ( ...

  7. CMOS图像传感器同时感知和处理光学图像

    CMOS图像传感器同时感知和处理光学图像 概述 近年来,机器视觉技术有了巨大的飞跃,现在已经成为各种智能系统的一个组成部分,包括自主车辆和机器人.通常,视觉信息由基于帧的摄像机捕获,转换成数字格式,然 ...

  8. GPU—加速数据科学工作流程

    GPU-加速数据科学工作流程 GPU-ACCELERATE YOUR DATA SCIENCE WORKFLOWS 传统上,数据科学工作流程是缓慢而繁琐的,依赖于cpu来加载.过滤和操作数据,训练和部 ...

  9. 使用Keil语言的嵌入式C编程教程(下)

    使用Keil语言的嵌入式C编程教程(下) 用8051单片机进行定时器/计数器的计算与编程 延迟是应用软件开发中的重要因素之一.然而,在实现定时延迟的过程中,正常的延迟并不能给出克服这一问题的宝贵结果. ...

  10. C++中头文件和实现文件的关系

    头文件相当于是声明的集合,包括头文件的语句#Include实质为程序代码的宏替换. 编译阶段将函数和变量登记在符号表,链接时将各种函数的入口地址在其中查找到来调用,解引用.