bash参考手册之三(基本的Shell特性)续三


3.2.5 协同处理

coprocess(协同处理)是在一个shell命令前面加上coproc保留字。一个协同处理在子shell中异步执行,就像以‘&’控制操作符终止的命令,同时,在正在执行的shell和协同处理之间建立一个双向的管道。
协同处理的格式是:
coproc [NAME] command [redirections]
这将创建一个名为NAME的协同处理。如果不提供NAME,默认名称为COPROC。如果command是一个简单的命令(见简单的命令),则不能提供NAME;否则,它会在简单指令的第一个单词后被中断。
当协同处理器执行时,shell在正在执行的shell上下文中创建一个名字为NAME的数组变量(见数组)。在正在执行的shell中,command的标准输出通过管道连接到一个文件描述符,该文件描述符被指定给NAME[0]。在正在执行的shell中,command的标准输入通过管道连接到一个文件描述符,该文件描述符被指定给NAME[1]。这个管道在命令指定的任何重定向之前被建立起来。该文件描述符可被用来作为shell命令的参数和重定向,可以使用标准的单词扩展。
shell为执行协同处理产生的进程ID,可以在变量NAME_PID中获得。内建命令wait可用于等待协同处理终止。
协同处理的返回状态是command的退出状态。

3.2.6 GNU并行

GNU并行,正如它的名字所暗示的,可用于并行构建和运行命令。您可以运行相同的命令,用不同的参数,不管他们是文件名,用户名,主机名,或从文件中读取的行。
完整的描述,请参阅GNU并行文档。下面举几个例子,简要介绍一下它的用途。
例如,在一个文本文件中每一行的开头增加指定的字符串:
cat file | parallel -k echo prefix_string
需要保留行的顺序的话,使用-k选项。
同样的,也可以在一个文本文件中的每一行的行尾追加指定的字符串:
cat file | parallel -k echo {} append_string
当文件的数量太大而不能使用mv来处理时,可以使并行移动当前目录中的文件:
ls | parallel mv {} destdir
正如你看到的,{}被替换成从标准输入中读取的每一行。这将运行与在当前目录中的文件数相同数量的mv命令。可以通过加入-X选项,模拟一个并行xargs:
ls | parallel -X mv {} destdir
GNU并行可以取代某些常做的操作,比如操作从文件中读取的行(在这个例子里,是文件名):
for x in $(cat list); do
do-something1 $x config-$x
do-something2 < $x
done | process-output
使用一个更紧凑的lambda表达式:
cat list | parallel "do-something1 {} config-{} ; do-something2 < {}" | process-output
并行提供了一个内置的机制来去除文件扩展名,这使其常用来批量转换文件,或文件重命名:
ls *.gz | parallel -j+0 "zcat {} | bzip2 >{.}.bz2 && rm {}"
这将使用bzip2重新压缩在当前目录中的所有文件名以.gz结束的文件。并行的在每个CPU上运行作业(-j+0)。
如果一个命令生成输出,可能要在输出中保持输入的顺序。例如,下面的命令
{ echo foss.org.my ; echo debian.org; echo freenetproject.org; } | parallel traceroute
第一个完成traceroute调用的输出将先显示。使用-k选项,
{ echo foss.org.my ; echo debian.org; echo freenetproject.org; } | parallel -k traceroute
确保首先显示traceroute foss.org.my的输出。

原文链接:http://www.gnu.org/software/bash/manual/bash.html#Coprocesses

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值