- 论坛徽章:
- 0
|
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 都得到以上结果:
- #!/bin/bash
- cmd1 () {
- echo cmd1out; echo cmd1err >&2
- }
- cmd2 () {
- echo cmd2out; echo cmd2err >&2
- }
- cmd3 () {
- cat; echo cmd3out; echo cmd3err >&2
- }
- cmd4 () {
- cat; echo cmd4out; echo cmd4err >&2
- }
- exec 3>&1; exec 4>&1
- s=$(((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1)
- exec 3>&-; exec 4>&-
- echo "s=$s"
- echo
- echo "Data in file a ::"
- cat a
- echo
- echo "Data in file b ::"
- cat b
复制代码 |
|