进程替换允许使用文件名引用进程的输入或输出。它采取的形式
代码语言:javascript复制<(list)
or
代码语言:javascript复制>(list)
进程列表以异步方式运行,其输入或输出显示为文件名。作为扩展的结果,此文件名作为参数传递给当前命令。
左括号和(>|<)间不能有空格,否则会认定为重定向。
Example 1
代码语言:javascript复制[root@icecube ~]# cat 1.sh
#!/bin/bash
seq 10
[root@icecube ~]# bash 1.sh
1
2
3
4
5
6
7
8
9
10
[root@icecube ~]# while read line;do echo $line;done < `bash 1.sh`
-bash: `bash 1.sh`: ambiguous redirect
[root@icecube ~]# while read line;do echo $line;done < <(bash 1.sh)
1
2
3
4
5
6
7
8
9
10
在此示例,我们将执行脚本的输出通过while循环打印, 若采用`bash 1.sh`命令替换写法将直接报错,而通过进程替换则完美得到我们想要的结果。
<和<()间应有空格。<从文件读取,<()为进程替换,把命令输出的内容当作一个文件。
Example 2
代码语言:javascript复制[root@icecube ~]# cat 1.txt
1
2
3
4
5
[root@icecube ~]# cat 2.txt
a
b
c
d
e
[root@icecube ~]# # 等价与cat 2.txt >>1.txt
[root@icecube ~]# sed '$r'<(cat 2.txt) 1.txt
1
2
3
4
5
a
b
c
d
e
[root@icecube ~]# # 配合<<here document可以帮助我们省略掉临时文件
[root@icecube ~]# sed '$r'<(cat<<EOF
> a
> b
> c
> d
> e
> EOF) 1.txt
1
2
3
4
5
a
b
c
d
e