管道
- 管道是进程通信的方式
- 信号也是进程通信的方式,例如
kill -9 pid
是让进程处于某种运行状态
- 匿名管道(管道符
|
)是Shell编程经常用到的通信工具
- 管道符是
|
,将前一个命令执行的结果传递给后面的命令
;
只是隔开多条命令,顺序执行,命令之间没有任何关系
Session A
1 2 3 4 5 6 7
| $ cat | tail -f | ps -f UID PID PPID C STIME TTY TIME CMD root 2348 2344 0 16:12 pts/1 00:00:00 -bash root 2971 2348 0 19:13 pts/1 00:00:00 cat root 2972 2348 0 19:13 pts/1 00:00:00 tail -f root 2973 2348 0 19:13 pts/1 00:00:00 ps -f
|
- cat的本质:将文本内容作为输入,与终端建立连接
- 管道符
|
给两边的外部命令分别创建了对应的子进程,对应pid为2971、2972、2973(已结束)
- 如果子进程是Shell脚本,称为子Shell(如果使用了cd、pwd等内建命令,作用范围仅限于子Shell之内)
Session B
2971的1和2972的2建立了连接,即前一个命令的标准输出与后一个命令的标准输入建立了连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [root@localhost ~]# ls -l /proc/2971/fd 总用量 0 lrwx------. 1 root root 64 10月 17 19:18 0 -> /dev/pts/1 l-wx------. 1 root root 64 10月 17 19:18 1 -> pipe:[53011] lrwx------. 1 root root 64 10月 17 19:13 2 -> /dev/pts/1
[root@localhost ~]# ls -l /proc/2972/fd 总用量 0 lr-x------. 1 root root 64 10月 17 19:18 0 -> pipe:[53011] l-wx------. 1 root root 64 10月 17 19:18 1 -> pipe:[53013] lrwx------. 1 root root 64 10月 17 19:13 2 -> /dev/pts/1
[root@localhost ~]# ls -l /proc/2973/fd ls: 无法访问/proc/2973/fd: 没有那个文件或目录
|
重定向
- 重定向的本质:将进程的输入和输出与文件建立连接
- 进程运行时会默认打开标准输入(fd=0),标准输出(fd=1)、错误输出(fd=2)
- 输入重定向:
<
- 输出重定向:
>
(覆盖)、>>
(追加)、2>
(错误重定向)、&>
(全部重定向)
- 输入重定向 + 输出重定向 – 常用于在Shell中生成配置文件
cat > /path/to/file <<EOF
输入重定向
1 2 3 4 5 6 7
| [root@localhost ~]# wc -l 123 456 # 输入CTRL+D 2
[root@localhost ~]# wc -l < /etc/passwd 20
|
1 2 3 4 5 6 7 8 9
| [root@localhost ~]# read var 123 [root@localhost ~]# echo $var 123
[root@localhost ~]# echo 123 > a.txt [root@localhost ~]# read var2 < a.txt [root@localhost ~]# echo $var2 123
|
输出重定向
1 2 3 4 5 6 7 8
| [root@localhost ~]# echo $var2 > b.txt [root@localhost ~]# cat b.txt 123
[root@localhost ~]# echo $var2 >> b.txt [root@localhost ~]# cat b.txt 123 123
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| [root@localhost ~]# nocmd -bash: nocmd: 未找到命令 [root@localhost ~]# nocmd 2> error.txt [root@localhost ~]# cat error.txt -bash: nocmd: 未找到命令
[root@localhost ~]# ls &> ls.txt [root@localhost ~]# cat ls.txt anaconda-ks.cfg a.txt b.txt error.txt ls.txt
|
组合使用(生成配置文件)
1 2 3 4 5 6
| [root@localhost ~]# cat combine.sh #!/bin/bash
cat > /root/a.sh <<EOF echo "hello bash" EOF
|
1 2 3
| [root@localhost ~]# bash combine.sh [root@localhost ~]# cat a.sh echo "hello bash"
|
参考资料
Linux实战技能100讲