管道
1.衔接两个命令,前一个的输出作为后一个的输入;
2.管道会触发创建子进程;
[root@iZuf6ir4og87e245nh5ltuZ ~]# echo $$ 输出当前进程PID
10335
[root@iZuf6ir4og87e245nh5ltuZ ~]# echo $BASHPID 输出当前进程PID
10335
//$$ $BASHPID 都输出当前进程PID
开辟子进程
[root@iZuf6ir4og87e245nh5ltuZ ~]# echo $$ | more
10335 //但是显示的还是当前进程PID,说明没有开启新的子进程,说明$$优先级高于|管道符,
先%%赋值为当前进程PID,在运算管道符
[root@iZuf6ir4og87e245nh5ltuZ ~]# echo $BASHPID | more
10357 //开启新的子进程PID, $BASHPID 优先级低于管道
[root@iZuf6ir4og87e245nh5ltuZ ~]#
Linux有父子进程,常规下,父子进程数据隔离,export命令可以让变量从父进程导入到子进程,子进程可以看到父进程变量,子进程只可以看到,父子进程修改互不影响
# tail -f test.sh
#!/bin/bash
echo $$
echo $num1
num1=999
echo num1:$num1
sleep 20
echo afterNUM1: $num1
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# echo $num1
1
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ((num1++))
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# echo $num1
2 //父进程为2
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ./test.sh &
[1] 10449
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# 10449
num1:999
afterNUM1: 999
^C
[1]+ Done ./test.sh
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# export num1 //子进程也可看到
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ./test.sh &
[1] 10451
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# 10451
2 //子进程读到2
num1:999 子进程修改成999
^C
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# echo $num1
2 父进程还是2 说明子进程修改不影响父进程
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# afterNUM1: 999
export $num1^C
[1]+ Done ./test.sh
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ./test.sh &
[1] 10459
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# 10459
2
num1:999
^C
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ((num1++))
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# ((num1++)) 父进程修改
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# echo $num1
4
[root@iZuf6ir4og87e245nh5ltuZ redis_test]# afterNUM1: 999 //父进程修改不影响子进程
^C
[1]+ Done ./test.sh