2014-02-13 54 views
0
#!/bin/sh 
# Tcl ignores the next line -*- tcl -*- \ 
exec wish "$0" -- "[email protected]" 

exec -ignorestderr -- {*}$argv >@stdout 2>@stderr 

exit 

_传收标准文件描述符子进程

$ wish test.sh -- sh -c date 2>&1 | cat 
Thu Feb 13 23:08:09  2014 

如果我不用管stdout或stderr,我得到:channel wasn't opened for writing。但是如果它关闭了,我希望tcl将关闭的文件描述符传递给子进程。我不希望tcl捕获命令的输出。

回答

-1

我多次阅读您的问题,但仍未能理解您尝试做什么。但是,你的脚本看起来太复杂了。如果你想要做的就是捕捉date命令的输出:

set output [exec date] 
puts $output; # Delete this line if you don't want any output. 

只是打电话date是不够的,你没有做到这一点:

sh -c date 2>&1 | cat 

我知道这可能不是成为你正在寻找的答案。如果您仍然需要帮助,请在您的问题中进一步解释。

+0

我看你不知道什么是关闭fd是 – basin

0

请勿在的同一时间使用stderr的重定向。该选项通过使用重定向在内部工作(进入一个简单的管道),所以当你混合这两件事情时,它们会争夺子进程的真实标准错误通道的配置。你不想那样。

在您的具体情况下,由于您希望stderr通过连接,只需省略-ignorestderr选项。

exec -- {*}$argv >@stdout 2>@stderr 

注意,这是从一个封闭stderr工作不同!这会导致各种事情崩溃;几乎所有你遇到的Unix进程都假定它是开放的,并且可以写入它。

+0

重定向到'/ dev/null'比关闭好得多...... –

+0

他们认为它是开放的,他们不检查write()的结果,所以当它关闭时,它们不会死亡 – basin

+0

感谢您提供有关'-ignorestderr'' – basin