LinuxSir.Org  
| 网站首页 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
置顶的主题 精华主题  
主题工具
旧 04-04-02, 20:13 第 1 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

标题: 如何把一个命令的输出放进多个管道里去,并让那些管道命令并行化[深刻理解重定向]


rt







__________________
IBOX, a LiveCD distribution based on Gentoo, is fit for newbie.

IBOX brings to you:
- knoppix-style harddisk installation tool, by which you can install Gentoo in 20 minutes.
- hardware auto-configuration. You can run into X desktop directly.
- all-round software set, including OpenOffice, azureus.
- LiveCD-create-tools. Step-by-step, custom a LiveCD yourself with ease.

Any questions and feedbacks is welcome to home_king at 163 dot com
  home_king 当前离线   回复时引用此帖
旧 04-04-02, 20:21 第 2 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

在ksh里有协进程这么一个概念,不知道你指的是否是这个? :ask
  KornLee 当前离线   回复时引用此帖
旧 04-04-02, 20:38 第 3 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 javalee 发表
在ksh里有协进程这么一个概念,不知道你指的是否是这个? :ask
Bash也有协同进程这个概念。
我举个例子,它的作用是用来并行解压缩某一个目录所有的压缩包。
代码:
#!/bin/sh for arch in $(ls | egrep '*.tar.[bg]z(2|)'); do case ${arch##*.} in bz2) tar jxf $arch -C /tmp & ;; *) tar zxf $arch -C /tmp & ;; esac done wait
但协同进程与多管道有关联吗?或者说,如何关联起来?bash可以实现多管道吗?

此帖于 04-04-02 20:45 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-02, 20:57 第 4 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

另外,bash还有进程替换的概念。
对进程的输入为>(list),对进程的输出为<(list)
举例如下:
cmp <(prog1) <(prog2)
该命令通过命名管道把两个程序的输出连接倒cmp的输入中,比较它们的差别。

不过好像都不符合我的要求。
  home_king 当前离线   回复时引用此帖
旧 04-04-02, 23:24 第 5 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

协进程据我所知,是ksh独有的!不信你可以看看别的shell的文章,看是否有所提及?
  KornLee 当前离线   回复时引用此帖
旧 04-04-02, 23:30 第 6 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 javalee 发表
协进程据我所知,是ksh独有的!不信你可以看看别的shell的文章,看是否有所提及?
不是的(希望你说的协进程与我说的协同进程一个概念吧)。楼上的程序就是bash协同进程的一个典型例子,bash青出于蓝,ksh有的,它一定会有,而且做得更加好。
代码:
#!/bin/sh for arch in $(ls | egrep '*.tar.[bg]z(2|)'); do case ${arch##*.} in bz2) tar jxf $arch -C /tmp & ;; *) tar zxf $arch -C /tmp & ;; esac done wait
还是讨论一下多管道吧。如何实现呢?
  home_king 当前离线   回复时引用此帖
旧 04-04-03, 00:00 第 7 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

恕在下愚昧,我理解的使用协进程可以减少进程数量,从而提高工作效率,是通过>&p,<&p的operator来实现多个进程协同处理,再和exec结合才得以实现(ksh),典型例子见:
http://www.linuxsir.org/bbs/showthre...threadid=29701
之<<一个小计算器脚本 >>
  KornLee 当前离线   回复时引用此帖
旧 04-04-03, 00:02 第 8 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

很明显,我们的理解偏差很大!,我能力有限,仅此而已!望见谅!
  KornLee 当前离线   回复时引用此帖
旧 04-04-03, 04:17 第 9 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

我不太理解home_king所说的的“并行解压缩”的概念。能否解释一下你的例子是如何实现的呢? 我想我的问题是for loop是在tar命令完成后还是一个文件tar着呢就for到下一个文件呢?







__________________
15" C2D MBP.
有简单的,不用复杂的!看到复杂的,尽量简单化!
Unix/Linux Philosophy: Be small! Be concentrated! One program does one thing and do it perfectly!
∞ years - 宇宙中最后的物质 Proton heat death. 之后,宇宙将以纯能量的形式永远存在。。。一切皆空
  yongjian 当前离线   回复时引用此帖
旧 04-04-03, 04:23 第 10 帖
yongjian
 
yongjian 的头像
 
 
★版☆主★  
  注册日期: May 2003
  我的住址: Linux
  帖子: 2,576
  精华: 9
 

不知这种算不算是管道并行呢:
cat < data1 > data2
将 data1中的内容导出同时导入到另一个文件。但是用的不同的文件描述符吧。
  yongjian 当前离线   回复时引用此帖
旧 04-04-03, 08:02 第 11 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 yongjian 发表
我不太理解home_king所说的的“并行解压缩”的概念。能否解释一下你的例子是如何实现的呢? 我想我的问题是for loop是在tar命令完成后还是一个文件tar着呢就for到下一个文件呢?
for只是一个循环结构,实际的步骤是它的循环体,在这个例子中就是解压缩。
使用了bash的wait来等待每个放进后台的解压缩进程的结束,以免出现"孤儿进程",并协调它们的并行操作。在超线程或多CPU架构上,这样的协同进程是高效的。

此帖于 04-04-03 15:07 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-03, 08:07 第 12 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

引用:
最初由 yongjian 发表
不知这种算不算是管道并行呢:
cat < data1 > data2
将 data1中的内容导出同时导入到另一个文件。但是用的不同的文件描述符吧。
嗯,也算吧。不过,我要求的是"输出方向多管道并行",而不是双向。
但即使是双向,正如我上面提及的"替换进程"概念,也是很难实现的。尤其把同一个输出放进多管道中去。(注意,这样cmd1|cmd2只是一个单管道)
  home_king 当前离线   回复时引用此帖
旧 04-04-03, 09:33 第 13 帖
r2007
 
r2007 的头像
 
 
注册会员  
  注册日期: Jul 2003
  帖子: 166
  精华: 0
 

bash的很多特性是仿效ksh的,当然还有它自己的一些新特性,就协进程而言,bash目前还没有实现。
楼主所举例子的只是一个循环,然后在循环中丢一些后台命令跑,仅仅是并行处理而已。就目前所知只有ksh有专门的协处理命令。bash可以用命名管道实现,不过有些繁琐,不如ksh简洁易读。
另外,能否请楼主解释一下什么是多管道运行?
请问有几个程序产生输出,又有几个程序处理这些输出?
最好举例说明一下。
  r2007 当前离线   回复时引用此帖
旧 04-04-03, 09:37 第 14 帖
home_king
 
home_king 的头像
 
 
临时退役版主  
  注册日期: Mar 2003
  帖子: 2,759
  精华: 15
 

的确,现在bash的协同进程不好。It works like chaos!
比如说有一个命令command1,要求它产生的输出不能保存为文件,并同时用两个过滤命令command2与command3来处理它的输出。

此帖于 04-04-03 09:39 被 home_king 编辑.
  home_king 当前离线   回复时引用此帖
旧 04-04-03, 11:56 第 15 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 home_king 发表
的确,现在bash的协同进程不好。It works like chaos!
比如说有一个命令command1,要求它产生的输出不能保存为文件,并同时用两个过滤命令command2与command3来处理它的输出。
在ksh的书中,有关dbx命令可以实现,我去找找看~
  KornLee 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 11:47


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2012, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2011, LinuxSir.Org