高级shell编程笔记(第二十二章 进程替换)

第二十二章 进程替换

进程替换与命令替换(command substitution)很相似。命令替换把一个命令的结果赋给一个变量。例如 dir_contents=`ls -al`或 xref=$( grep word datafile)。进程替换则是把一个进程的输出回馈给另一个进程 (换句话说,它把一个命令的结果发送给另一个命令)。

启动进程替换。它是用/dev/fd/文件把在圆括号内的进程的处理结果发送给另外一个进程。(注:实际上现代的 UNIX 类操作系统提供的/dev/fd/n 文件是与文件描述相关 的,整数 n 指的就是在进程运行时对应数字的文件描述符)

注意:在"<" 或 or “>” 与圆括号之间是没有空格的。如果加了空格将会引起错误信息。

[root@localhost shell]# echo >(true)
/dev/fd/63
[root@localhost shell]# echo <(true)
/dev/fd/63

Bash 在两个文件描述符之间创建了一个管道,fIn 和 fOut。true 命令的标准输入被连接到 fOut(dup2(fOut,0)),然后 Bash 把/dev/fd/fIn 作为参数传给 echo。如果系统的/dev/fd/文件不够时,Bash 会使用临时文件。

进程替换能比较两个不同命令之间的输出,或者甚至相同命令不同选项的输出。

[root@localhost shell]# cat <(ls -l) <(ls -al)
total 4
-rw------- 1 root root   0 Aug 25 20:56 a.1
-rw------- 1 root root   0 Aug 25 20:56 b.1
-rw------- 1 root root   0 Aug 25 20:56 c.1
-rw------- 1 root root   0 Aug 25 20:56 d.1
-rw------- 1 root root   0 Aug 25 20:56 t2.sh
-rw------- 1 root root 757 Aug 25 22:06 test.sh
total 12
drwx------  2 root root 4096 Aug 25 22:06 .
drwxr-xr-x. 5 root root 4096 Aug 21 07:27 ..
-rw-------  1 root root    0 Aug 25 20:56 a.1
-rw-------  1 root root    0 Aug 25 20:56 b.1
-rw-------  1 root root    0 Aug 25 20:56 c.1
-rw-------  1 root root    0 Aug 25 20:56 d.1
-rw-------  1 root root    0 Aug 25 20:56 t2.sh
-rw-------  1 root root  757 Aug 25 22:06 test.sh

用进程替换来比较两个不同目录的内容 (考察哪些文件名是相同的,哪些是不同的):

[root@localhost opt]# diff <(ls /opt/shell) <(ls /opt/shell.new/)
1d0
< a.1
3d1
< c.1
5c3
< t2.sh
---
> qwer.txt

其它一些进程替换的用法和技巧:

cat <(ls -l)
#等同于ls -l |cat

sort -k 9 <(ls -l /bin) <(ls -l /usr/bin) <(ls -l /usr/X11R6/bin)
#-k 9:表示第9列
#列出系统中 3 个主要的'bin'目录的所有文件,并且按文件名排序.
#注意是三个明显不同的命令输出回馈给'sort'.

tar cf >(bzip2 -c > file.tar.bz2) $directory_name
# 调用"tar cf /dev/fd/?? $directory_name",和"bzip2 -c > file.tar.bz2".
#因为/dev/fd/的系统属性,所以两个命令之间的管道不必是命名的.

#这种效果可以模仿出来.
bzip2 -c < pipe > file.tar.bz2 &
tar cf pipe $directory_name
rm pipe
#或者
exec 3>&1
tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&-
exec 3>&-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值