Linux管道pipeline使用时需要注意的问题

1. 管道会将前一个命令的输出作为后一个命令的输入
[root@node01 /]# ll | more
total 94
dr-xr-xr-x.  2 root root  4096 Oct 15 07:19 bin
dr-xr-xr-x.  5 root root  1024 Oct 15 00:17 boot
drwxr-xr-x.  2 root root  4096 Oct  9  2018 cgroup
drwxr-xr-x. 19 root root  3740 Oct 16 07:20 dev
drwxr-xr-x. 63 root root  4096 Oct 16 10:38 etc
drwxr-xr-x.  2 root root  4096 Sep 23  2011 home
dr-xr-xr-x.  8 root root  4096 Oct 15 00:07 lib
dr-xr-xr-x.  9 root root 12288 Oct 15 07:19 lib64
drwx------.  2 root root 16384 Aug  7 06:24 lost+found
drwxr-xr-x.  2 root root  4096 Sep 23  2011 media
drwxr-xr-x.  2 root root  4096 Sep 23  2011 mnt
drwxr-xr-x.  4 root root  4096 Oct 15 07:45 opt
dr-xr-xr-x. 93 root root     0 Oct 16 07:19 proc
dr-xr-x---.  3 root root  4096 Oct 15 23:23 root
dr-xr-xr-x.  2 root root 12288 Oct 15 07:19 sbin
drwxr-xr-x.  7 root root     0 Oct 16 07:19 selinux
drwxr-xr-x.  2 root root  4096 Sep 23  2011 srv
drwxr-xr-x  13 root root     0 Oct 16 07:19 sys
drwxrwxrwt.  3 root root  4096 Oct 16 07:20 tmp
drwxr-xr-x. 13 root root  4096 Aug  7 06:24 usr
drwxr-xr-x. 17 root root  4096 Aug  7 06:24 var

2. 管道两边会创建子进程
[root@node01 /]# num=0
[root@node01 /]# echo $num
0
[root@node01 /]# ((num++))
[root@node01 /]# echo $num
1
[root@node01 /]# ((num++)) | echo ok
ok
[root@node01 /]# echo $num
1

3. $$ 代表/bin/bash,$BASHPID同样代表/bin/bash,但是二者有区别,$$ 的优先级高于 |$BASHPID的优先级低于 |
[root@node01 /]# echo $$ | more
1728
[root@node01 /]# echo $$
1728
[root@node01 /]# echo $BASHPID | more
1764
[root@node01 /]# echo $BASHPID | more
1766

4. Linux父子进程的数据隔离

请区分exit退出子进程前后的现象

  1. exit之前展示的是父子进程的数据是隔离的
  2. exit之后展示的是父进程可以让子进程看到自己的数据,需要export
  3. 对于export的环境变量,子进程的修改不会影响父进程,父进程的修改也不会影响子进程(代码没有演示)
[root@node01 /]# num=0
[root@node01 /]# echo $num
0
[root@node01 /]# echo $$
1728
[root@node01 /]# /bin/bash
[root@node01 /]# echo $$
1772
[root@node01 /]# pstree
init─┬─auditd───{auditd}
     ├─login───bash
     ├─5*[mingetty]
     ├─mysqld_safe───mysqld───27*[{mysqld}]
     ├─3*[redis-server───4*[{redis-server}]]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───bash───pstree
     └─udevd───2*[udevd]
[root@node01 /]# echo $num

[root@node01 /]# 
[root@node01 /]# exit
exit
[root@node01 /]# pstree
init─┬─auditd───{auditd}
     ├─login───bash
     ├─5*[mingetty]
     ├─mysqld_safe───mysqld───27*[{mysqld}]
     ├─3*[redis-server───4*[{redis-server}]]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     └─udevd───2*[udevd]
[root@node01 /]# echo $num
0
[root@node01 /]# export num
[root@node01 /]# /bin/bash
[root@node01 /]# pstree
init─┬─auditd───{auditd}
     ├─login───bash
     ├─5*[mingetty]
     ├─mysqld_safe───mysqld───27*[{mysqld}]
     ├─3*[redis-server───4*[{redis-server}]]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───bash───pstree
     └─udevd───2*[udevd]
[root@node01 /]# echo $num
0
[root@node01 /]# 

5. 如何让进程在后台执行

在指令后面加个 &

[root@node01 /]# ./test.sh &

6. fork()创建子进程的原理

写时复制

目的:避免创建子进程时拷贝了大量的父进程里的数据,因为子进程可能不会把所有父进程的数据都重新写一遍

在这里插入图片描述
更详细的可以参阅:https://www.cnblogs.com/wuchanming/p/4495479.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值