LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 29091|回复: 35

命令输出放进多个管道,并让管道命令并行化[深刻理解重定向及IO重定向详解]

[复制链接]
发表于 2004-4-2 20:13:24 | 显示全部楼层 |阅读模式
rt
发表于 2004-4-2 20:21:34 | 显示全部楼层
在ksh里有协进程这么一个概念,不知道你指的是否是这个? :ask
 楼主| 发表于 2004-4-2 20:38:37 | 显示全部楼层
最初由 javalee 发表
在ksh里有协进程这么一个概念,不知道你指的是否是这个? :ask

Bash也有协同进程这个概念。
我举个例子,它的作用是用来并行解压缩某一个目录所有的压缩包。

  1. #!/bin/sh
  2. for arch in $(ls | egrep '*.tar.[bg]z(2|)'); do
  3.       case ${arch##*.} in
  4.                bz2) tar jxf $arch -C /tmp & ;;
  5.                *) tar zxf  $arch -C /tmp & ;;
  6.       esac   
  7. done
  8. wait
复制代码


但协同进程与多管道有关联吗?或者说,如何关联起来?bash可以实现多管道吗?
 楼主| 发表于 2004-4-2 20:57:16 | 显示全部楼层
另外,bash还有进程替换的概念。
对进程的输入为>(list),对进程的输出为<(list)
举例如下:
cmp <(prog1) <(prog2)
该命令通过命名管道把两个程序的输出连接倒cmp的输入中,比较它们的差别。

不过好像都不符合我的要求。
发表于 2004-4-2 23:24:33 | 显示全部楼层
协进程据我所知,是ksh独有的!不信你可以看看别的shell的文章,看是否有所提及?
 楼主| 发表于 2004-4-2 23:30:32 | 显示全部楼层
最初由 javalee 发表
协进程据我所知,是ksh独有的!不信你可以看看别的shell的文章,看是否有所提及?

不是的(希望你说的协进程与我说的协同进程一个概念吧)。楼上的程序就是bash协同进程的一个典型例子,bash青出于蓝,ksh有的,它一定会有,而且做得更加好。

  1. #!/bin/sh
  2. for arch in $(ls | egrep '*.tar.[bg]z(2|)'); do
  3.       case ${arch##*.} in
  4.                bz2) tar jxf $arch -C /tmp & ;;
  5.                *) tar zxf  $arch -C /tmp & ;;
  6.       esac   
  7. done
  8. wait
复制代码

还是讨论一下多管道吧。如何实现呢?
发表于 2004-4-3 00:00:41 | 显示全部楼层
恕在下愚昧,我理解的使用协进程可以减少进程数量,从而提高工作效率,是通过>&p,<&p的operator来实现多个进程协同处理,再和exec结合才得以实现(ksh),典型例子见:
http://www.linuxsir.cn/bbs/showthread.php?threadid=29701
之<<一个小计算器脚本 >>
发表于 2004-4-3 00:02:12 | 显示全部楼层
很明显,我们的理解偏差很大!,我能力有限,仅此而已!望见谅! :sorry
发表于 2004-4-3 04:17:17 | 显示全部楼层
我不太理解home_king所说的的“并行解压缩”的概念。能否解释一下你的例子是如何实现的呢? 我想我的问题是for loop是在tar命令完成后还是一个文件tar着呢就for到下一个文件呢?
发表于 2004-4-3 04:23:47 | 显示全部楼层
不知这种算不算是管道并行呢:
cat < data1 > data2
将 data1中的内容导出同时导入到另一个文件。但是用的不同的文件描述符吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表