进程替换与命令替换(command substitution)很相似. 命令替换把一个命令的结果赋给一个变量,例如 dir_contents=`ls -al`或xref=$( grep word datafile). 进程替换则是把一个进程的输出回馈给另一个进程 (换句话说,它把一个命令的结果发送给另一个命令).
>(command)
<(command)
启动进程替换. 它是用/dev/fd/<n>文件把在圆括号内的进程的处理结果发送给另外一个进程. [1] (译者注:实际上现代的UNIX类操作系统提供的/dev/fd/n文件是与文件描述相关的,整数n指的就是在进程运行时对应数字的文件描述符)
在"<" 或or ">" 与圆括号之间是没有空格的. 如果加了空格将会引起错误信息. |
bash$ echo >(true) /dev/fd/63 bash$ echo <(true) /dev/fd/63 |
进程替换能比较两个不同命令之间的输出,或者甚至相同命令不同选项的输出.
bash$ comm <(ls -l) <(ls -al) total 12 -rw-rw-r-- 1 bozo bozo 78 Mar 10 12:58 File0 -rw-rw-r-- 1 bozo bozo 42 Mar 10 12:58 File2 -rw-rw-r-- 1 bozo bozo 103 Mar 10 12:58 t2.sh total 20 drwxrwxrwx 2 bozo bozo 4096 Mar 10 18:10 . drwx------ 72 bozo bozo 4096 Mar 10 17:58 .. -rw-rw-r-- 1 bozo bozo 78 Mar 10 12:58 File0 -rw-rw-r-- 1 bozo bozo 42 Mar 10 12:58 File2 -rw-rw-r-- 1 bozo bozo 103 Mar 10 12:58 t2.sh |
用进程替换来比较两个不同目录的内容 (考察哪些文件名是相同的,哪些是不同的):
1 diff <(ls $first_directory) <(ls $second_directory) |
其他一些进程替换的用法和技巧:
1 cat <(ls -l) 2 # 等同于 ls -l | cat 3 4 sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin) 5 # 列出系统中3个主要的'bin'目录的所有文件,并且按文件名排序. 6 # 注意是三个明显不同的命令输出回馈给'sort'. 7 8 9 diff <(command1) <(command2) # 给出两个命令输出的不同之处. 10 11 tar cf >(bzip2 -c > file.tar.bz2) $directory_name 12 # 调用"tar cf /dev/fd/?? $directory_name",和"bzip2 -c > file.tar.bz2". 13 # 14 # 因为/dev/fd/<n>的系统属性, 15 # 所以两个命令之间的管道不必是命名的. 16 # 17 # 这种效果可以模仿出来. 18 # 19 bzip2 -c < pipe > file.tar.bz2& 20 tar cf pipe $directory_name 21 rm pipe 22 # 或者 23 exec 3>&1 24 tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&- 25 exec 3>&- 26 27 28 # Thanks, St |