管道作用

管道实际上就是进程之间的一个通信工具,那么用在Linux命令中主要是方便两条命令互相之间可以相互通信。

管道符

管道符(匿名管道)是Shell编程经常用到的通信工具。

管道符是"|",主要是把两个应用程序连接在一起,然后把第一个应用程序的输出,作为第二个应用程序的输入。如果还有第三个应用程序的话,可以把第二个程序的输出,作为第三个应用程序的输入,以此类推。

ls | grep test.sh ,在当前文件过滤出test.sh文件:

[root@lincoding /]# ls
bin data etc lib lost+found net opt root selinux sys usr
boot dev home lib64 media mnt proc sbin srv test.sh tmp
[root@lincoding /]# ls | grep test.sh
test.sh

管道符"|"就把ls命令的文件列表输出给到了grep test.sh命令来过滤文件。

管道符与分号符

管道符还有一个需要注意的地方,我们可以通过下面的命令观察到,在使用管道符的时候,管道符会为两条命令产生了子进程。

[root@lincoding /]# cat | ps -f
UID PID PPID C STIME TTY TIME CMD
root 2627 2623 0 14:57 pts/0 00:00:00 -bash
root 88029 2627 0 19:51 pts/0 00:00:00 cat
root 88030 2627 0 19:51 pts/0 00:00:00 ps -f

父进程bash的pid为2627,子进程cat的pid为88029,子进程ps -f的pid为88030

由于管道符是会为连接的命令产生子进程,所以也是不会影响当前环境的。

我们用cd /home/ | ls 命令验证下,运行结果如下:

[root@lincoding /]# cd /home/ | ls
bin data etc lib lost+found net opt root selinux sys usr
boot dev home lib64 media mnt proc sbin srv test.sh tmp
[root@lincoding /]# pwd
/

从以上的运行结果可以得知,类似切换目录cd这种会影响当前环境的命令,在使用了管道符之后,就没有对当前环境造成影响了。

如果使用分号";"连接两条命令会如何呢?

[root@lincoding /]# cd /sys/ ; ls
block bus class dev devices firmware fs hypervisor kernel module power
[root@lincoding sys]# pwd
/sys

可以得知,通过分号";"连接,cd命令会对当前环境造成影响。


小结

分号符和管道符都可以连接两条命令,但是其作用是不同的。

分号符实际上就是隔开两条命令,第一条执行完,接着执行完第二条,两条命令之间是没有任何关系的。

管道符的作用是把第一条执行的命令结果传递给第二条命令,同时会为第一条和第二条命令建立子进程,由于命令是在子进程运行的,如果命令有类似cd切换目录这种内建命令,也就不会对当前环境造成影响。所以在使用管道符的时候,要规避使用内建命令。

小鸟初学Shell编程(四)管道符的更多相关文章

  1. 小鸟初学Shell编程(一)认识Shell

    开篇介绍 Linux里非常的有用的一个功能,这个功能就叫Shell脚本. Shell脚本在我日常开发工作里也占了非常重要的角色,项目中一些简单的工作我们都可以使用Shell脚本来完成,比如定时删除日志 ...

  2. 小鸟初学Shell编程(七)变量引用及作用范围

    变量引用 那么定义好变量,如何打印变量的值呢?举例下变量引用的方式. ${变量名}称作为对变量的引用 echo ${变量名}查看变量的值 ${变量名}在部分情况下可以省略成 $变量名 [root@li ...

  3. 小鸟初学Shell编程(九)环境变量变量配置文件

    介绍 在上一篇使用完了环境变量,并且知道PATH环境变量概念,那么我们对命令的执行就有了一定深入的理解.那么PATH环境变量或其他环境变量是保存在哪呢?那么这篇文章主要介绍环境变量配置文件. 配置文件 ...

  4. 小鸟初学Shell编程(三)脚本不同执行方式的影响

    执行命令的方式 执行Shell脚本的方式通常有以下四种 方式一:bash ./test.sh 方式二:./test.sh 方式三:source ./test.sh 方式四:. ./test.sh 执行 ...

  5. 小鸟初学Shell编程(八)环境变量、预定义变量与位置变量

    环境变量 环境变量:每个Shell打开都可以获得到的变量. 我们知道通过export的方式打开可以让子进程读取父进程的变量的值,那怎么样才能让每一个进程都能读取到变量的值呢? 在这呢,系统有一些默认的 ...

  6. 小鸟初学Shell编程(六)变量赋值

    变量的意义 我们在使用Linux命令或脚本的时候,会有一些输出,那么这些输出的信息可以用变量临时存储,以备我们下一条命令或脚本使用. 变量的定义 变量的定义建议用一个有意义的英文单词来代表变量,不要使 ...

  7. 小鸟初学Shell编程(五)输入输出重定向

    重定向作用 一个进程默认会打开标准输入.标准输出.错误输出三个文件描述符. 重定向可以让我们的程序的标准输出.错误输出的信息重定向文件里,那么这里还可以将文件的内容代替键盘作为一种标准输入的方式. 重 ...

  8. 小鸟初学Shell编程(二)编写简单的Shell脚本

    Shell脚本 编写Python.PHP脚本通常需要掌握语言的函数,那么Shell脚本则不需要,只需要掌握Linux命令就可以编写Shell脚本,因为Shell脚本就是由多个Linux命令组成,通过将 ...

  9. shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

    一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...

随机推荐

  1. 【JavaWeb】实现二级联动菜单

    实现效果 频道信息 package demo; public class Channel { private String code; //频道编码 private String name; //频道 ...

  2. REST API的使用

    需求描述 GET: http://localhost:8080/MyWebsite/user/ Header: Content-Type = application/json Body: 空 Resp ...

  3. [Linux] 纯净ubuntu快速搭建宝塔面板

    宝塔官方建议是纯净的系统,我使用docker运行一个ubuntu容器,模拟一个纯净的系统,这样也不会影响到我的其他服务. docker run --name baota -id -p 8888:888 ...

  4. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...

  5. Java学习笔记(1)--- 简介

    简介: 注:和之前的C不一样,本人没有学过java,所以内容上可能会相对详细一些. 主要特性: 1.这跟c++一样是面对对象语言: Java语言提供类.接口和继承等面向对象的特性,为了简单起见,只支持 ...

  6. 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十五周学习总结 实验十三  Swing图形界面组件(二) 实验时间 2019-12-6 第一部分:理论知识总结 5> ...

  7. day75_10_22频率认证和jwt

    一.频率认证原理. 1.从dispatch中获取配置,找到setting中的配置. 2.从thtoyyling中寻找到各个认证类. 3.所有认证类都继承自basethrottle,basethrott ...

  8. MySQL实战45讲学习笔记:第三十六讲

    一.引子 今天是大年三十,在开始我们今天的学习之前,我要先和你道一声春节快乐! 在上一篇文章中,我们在优化 join 查询的时候使用到了临时表.当时,我们是这么用的: create temporary ...

  9. Spark SQL中出现 CROSS JOIN 问题解决

    Spark SQL中出现 CROSS JOIN 问题解决 1.问题显示如下所示:     Use the CROSS JOIN syntax to allow cartesian products b ...

  10. oracle使用sequence批量写数据

    本博客是对之前写的博客Oracle批量新增更新数据的补充,oracle的知识真是多,其实要学精任何一门知识都是要花大量时间的,正所谓: 学如逆水行舟,不进则退 先介绍oracle sequence的一 ...