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

来源:互联网 发布:淘宝返现客服回复技巧 编辑:程序博客网 时间:2024/05/22 00:52


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

原创粉丝点击