将关闭的标准文件描述符传递给子进程

时间:2014-02-13 19:12:22

标签: tcl

#!/bin/sh
# Tcl ignores the next line -*- tcl -*- \
exec wish "$0" -- "$@"

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捕获命令的输出。

2 个答案:

答案 0 :(得分:0)

请勿在{{1​​}}的同时使用stderr的重定向。该选项在内部使用重定向(进入一个简单排放的管道),所以当你混合这两个东西时,它们会争夺子进程真正标准错误通道的配置。你不希望这样。

在您的具体情况下,由于您希望通过-ignorestderr进行连接,因此请忽略stderr选项。

-ignorestderr

请注意,使用已关闭的exec -- {*}$argv >@stdout 2>@stderr 不同!这导致各种各样的事情破裂;你遇到过的几乎每一个Unix进程都认为它是开放的,并且只能写入它。

答案 1 :(得分:-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

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