免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 14012 | 回复: 29
打印 上一主题 下一主题

Shell 经典问题之 [ I/O 重定向] [4] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-25 12:43 |只看该作者 |倒序浏览
[Q] 对于命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能:

1.  所有命令并行执行
2.  cmd1 和 cmd2  不需要 stdin
3.  cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin
4.  cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin
5.  cmd3  的 stdout 定向到文件 a,  stderr 定向到屏幕
6.  cmd4  的 stdout 定向到文件 b,  stderr 定向到屏幕
7.  cmd1 的返回码赋给变量 s
8.  不能利用临时文件

论坛徽章:
0
2 [报告]
发表于 2004-11-25 23:16 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

等待解答

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-11-26 01:16 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

不知道我的理解是否正确 ?
1,这样是否算?
bash:
  1. echo abc|tee >(tr a-z A-Z) >(tr a-z 0-9)|rev
复制代码

ksh:

  1. #!/bin/ksh
  2. #this is my exercise about co-process
  3. bc -l|&
  4. echo -n "please input two number:"
  5. read a b
  6. print -p "$a*$b"|print -p "scale=2;$a/$b"|print -p "$a+$b"|print -p "$a-$b"
  7. read -p c;read -p d;read -p e;read -p f
  8. echo "$a*$b=$c\n$a/$b=$d\n$a+$b=$e\n$a-$b=$f"
复制代码

大家继续 ...

论坛徽章:
0
4 [报告]
发表于 2004-11-26 01:59 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

原帖由 "寂寞烈火"]echo abc|tee >(tr a-z A-Z) >(tr a-z 0-9)|rev[/quote 发表:


烈火兄, 如果

cmd1: echo abc
cmd2: (tr a-z A-Z)
cmd3: (tr a-z 0-9)
cmd4: rev

这个不满足条件 4, 5, 6, 7

[quote]原帖由 "寂寞烈火" 发表:
#!/bin/ksh
#this is my exercise about co-process
bc -l|&
echo -n "please input two number:"
read a b
print -p "$a*$b"|print -p "scale=2;$a/$b"|print -p "$a+$b"|print -p "$a-$b"
read -p c;read -p d;read -p e;read -p f
echo "$a*$b=$c\n$a/$b=$d\n$a+$b=$e\n$a-$b=$f"


这个也不满足条件 4, 5, 6, 7.
原文要求单向 pipe.  当然写出有  coprocess 的版本也可。不过比原题略易。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-11-26 02:46 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

原帖由 "lightspeed" 发表:


这个也不满足条件 4, 5, 6, 7.
原文要求单向 pipe.  当然写出有  coprocess 的版本也可。不过比原题略易。

哪找这样的4个命令呢?  
还望指教  

论坛徽章:
0
6 [报告]
发表于 2004-11-26 03:12 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

原帖由 "寂寞烈火" 发表:

哪找这样的4个命令呢?  
还望指教  


此题只是测试对重定向的理解。 不用将 cmd1 .. 具体化。

可以这样想像:  cmd1, cmd2 实际上是同一个处理数据的程序,但单进程
运算速度太慢, 因此并行计算。每一个计算一半数据。
cmd3 处理他们的输出。 cmd4 处理他们的出错。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-11-26 12:46 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

是不是需要先mkpipe???

论坛徽章:
0
8 [报告]
发表于 2004-11-26 12:57 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

[quote]原帖由 "寂寞烈火"]是不是需要先mkpipe???[/quote 发表:


本题用普通 pipe。  如果 mkpipe 就变简单了, 而且不满足条件1 -  同时执行。

比如这种形式:

cmd1 | cmd2 |cmd3|cmd4

在加上各种重定向以满足条件 1 - 8。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-11-26 13:23 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

lightspeed兄还是系统把题给详细的讲解一下,如何? 谢谢!

论坛徽章:
0
10 [报告]
发表于 2004-11-26 22:07 |只看该作者

Shell 经典问题之 [ I/O 重定向] [4]

Answer Key:



  1. exec 3>&1; exec 4>&1
  2. s=$(((((cmd1 1>&3 3>&- 4>&-; echo $? >&4 3>&- 4>&-)| cmd2 3>&- 4>&-) 3>&1 | cmd3 >a 2>&3 3>&- 4>&- ) 2>&1 | cmd4 >b 3>&- 4>&-) 4>&1)
  3. exec 3>&-; exec 4>&-

复制代码


以上是全版本,也可以去掉一部分内容(哪些内容?)而不影响结果, 不过
显得不太完美。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP