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退出子进程前后的现象
- exit之前展示的是父子进程的数据是隔离的
- exit之后展示的是父进程可以让子进程看到自己的数据,需要export
- 对于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()创建子进程的原理
写时复制
目的:避免创建子进程时拷贝了大量的父进程里的数据,因为子进程可能不会把所有父进程的数据都重新写一遍