免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lightspeed
打印 上一主题 下一主题

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

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

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

发完本帖,将执行下列语句:

exec  Shell 经典问题之 [ I/O 重定向]  >&-

本坛求道者寥寥, 信哉。

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

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

原帖由 "lightspeed" 发表:

以上是全版本,也可以去掉一部分内容(哪些内容?)而不影响结果, 不过
显得不太完美。

看的我已经晕菜啦  
确实经典之极!   

论坛徽章:
0
13 [报告]
发表于 2004-11-27 02:45 |只看该作者

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

这里是精简版本, 更容易理解。

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


下面是测试, 看看各个 cmd 的 stdout 和 stderr 都去了那里

  1. #!/bin/ksh
  2. alias cmd1='(echo cmd1out; echo cmd1err >&2)'
  3. alias cmd2='(echo cmd2out; echo cmd2err >&2)'
  4. alias cmd3='(cat; echo cmd3out; echo cmd3err >&2)'
  5. alias cmd4='(cat; echo cmd4out; echo cmd4err >&2)'
  6. exec 3>&1; exec 4>&1
  7. s=$(((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1)
  8. exec 3>&-; exec 4>&-
  9. echo "s=$s"
  10. echo
  11. echo "Data in file a ::"
  12. cat a
  13. echo
  14. echo "Data in file b ::"
  15. cat b               
复制代码

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

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

/home/lee/myfile#ksh -x testio.sh
+ alias cmd1=(echo cmd1out; echo cmd1err >&2)
+ alias cmd2=(echo cmd2out; echo cmd2err >&2)
+ alias cmd3=(cat; echo cmd3out; echo cmd3err >&2)
+ alias cmd4=(cat; echo cmd4out; echo cmd4err >&2)
+ exec
+ 3>&1
+ exec
+ 4>&1
+ let ((cmd1 1>&3 ; echo 0 >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1
testio.sh[7]: ((cmd1 1>&3 ; echo 0 >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1: missing )
+ s=
+ exec
+ 3>&-
+ exec
+ 4>&-
+ echo s=
s=
+ echo

+ echo Data in file a ::
Data in file a ::
+ cat a
cat: a: 没有那个文件或目录
+ echo

+ echo Data in file b ::
Data in file b ::
+ cat b
cat: b: 没有那个文件或目录

论坛徽章:
0
15 [报告]
发表于 2004-11-28 04:35 |只看该作者

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

原帖由 "寂寞烈火" 发表:
+ let ((cmd1 1>&3 ; echo 0 >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1
testio.sh[7]: ((cmd1 1>&3 ; echo 0 >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1: missing )


你用的是 pdksh, 相当于 ksh88. 明显对多层嵌套支持不够, 把此句解释为
算术操作了, 它希望在尾端找到 )),  所以报语法错。

下面是 ksh93  及 zsh (version 4.2.0) 的结果:

# test.sh
cmd3err
cmd4err
s=0

Data in file a ::
cmd2out
cmd1out
cmd3out

Data in file b ::
cmd2err
cmd1err
cmd4out         

bash 2.05 对上例中的 alias 语句解释不对, 可改成 function.
则  ksh93, zsh 4.x.x,  bash 2.05b  都得到以上结果:

  1. #!/bin/bash
  2. cmd1 () {
  3. echo cmd1out; echo cmd1err >&2
  4. }
  5. cmd2 () {
  6. echo cmd2out; echo cmd2err >&2
  7. }
  8. cmd3 () {
  9. cat; echo cmd3out; echo cmd3err >&2
  10. }
  11. cmd4 () {
  12. cat; echo cmd4out; echo cmd4err >&2
  13. }
  14. exec 3>&1; exec 4>&1
  15. s=$(((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1)
  16. exec 3>&-; exec 4>&-
  17. echo "s=$s"
  18. echo
  19. echo "Data in file a ::"
  20. cat a
  21. echo
  22. echo "Data in file b ::"
  23. cat b
复制代码

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

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

[quote]原帖由 "lightspeed"][/quote 发表:

原来如此,谢谢指教
P.S:放入收藏夹

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2004-11-28 15:09 |只看该作者

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

咔咔,看了几位的回复!

俺是革命尚未成功,同志仍须努力     

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2004-11-28 20:17 |只看该作者

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

[quote]原帖由 "lightspeed"]ㄏ

论坛徽章:
0
19 [报告]
发表于 2004-11-29 00:16 |只看该作者

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

原帖由 "網中人" 发表:

哈...
陽春白雪, 曲高和寡.
兄又何必在意呢?


Don't worry about it.

这里有引申出另外一个问题, 就是在嵌套的 subshell 中, ((...)) 会解释为
算术操作, 为避免非算术操作语句的错误解释, 可在适当的地方加 ; .  如:

(echo aaa)  # right
((echo aaa))  # wrong
((echo aaa); )  # right
((echo aaa); (echo bbb))  # right
(((echo aaa)) ; (echo bbb))  # wrong
(((echo aaa); ) ; (echo bbb))  # right
(((echo ((1+2)))) ; (echo bbb))  #  wrong
(((echo $((1+2)))); (echo bbb))  #  wrong
(((echo $((1+2))); ); (echo bbb))  #  right
(((echo $((1+2)); ); ); (echo bbb))  #  right

论坛徽章:
0
20 [报告]
发表于 2004-11-30 02:23 |只看该作者

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

看到此贴已经是子夜时分,shell版上寂寞烈火还是在线,果然是求道中人,我等愚民不可及之高。
窃以为自己还只是求知,未到求道之境,lightspeed所问对我而言确如似是而非,似懂非懂之间,无奈红尘缠身,罢了罢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP