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

Tcl 将关闭的标准文件描述符传递给子进程,tcl,Tcl,_ 如果我不使用管道stdout或stderr,我会得到:频道没有打开以进行写入。但是如果它是关闭的,我希望tcl将关闭的文件描述符传递给子进程。我不希望tcl捕获命令的输出。我多次阅读了您的问题,但仍然无法理解您试图做什么。但是,您的脚本似乎太复杂了。如果您只想捕获date命令的输出: $ wish test.sh -- sh -c date 2>&1 | cat Thu Feb 13 23:08:09 2014 只需调用date就足够了,您不必这样做: set out

_


如果我不使用管道stdout或stderr,我会得到:
频道没有打开以进行写入。但是如果它是关闭的,我希望tcl将关闭的文件描述符传递给子进程。我不希望tcl捕获命令的输出。

我多次阅读了您的问题,但仍然无法理解您试图做什么。但是,您的脚本似乎太复杂了。如果您只想捕获
date
命令的输出:

$ wish test.sh -- sh -c date 2>&1 | cat
Thu Feb 13 23:08:09     2014
只需调用
date
就足够了,您不必这样做:

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

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

不要在使用
-ignoresterr
的同时使用
stderr
重定向。该选项通过使用重定向(进入一个具有简单排水管的管道)在内部工作,因此当您混合使用这两种方法时,它们会争夺子流程真正的标准错误通道的配置。你不会想要的

在您的特定情况下,由于希望通过连接
stderr
,只需省略
-ignoresterr
选项即可

sh -c date 2>&1 | cat

请注意,这不同于使用关闭的
stderr
!这会导致各种各样的事情破裂;几乎您遇到的每个Unix进程都假定它是打开的,并且它们可以直接对其进行写入。

我知道您不知道关闭的fd是什么,直接到
/dev/null
比关闭要好得多…它们假定它是打开的,并且不检查
write()
的结果,所以当它关闭时,他们不想听到关于
-Ignoresterr
$grep-lx/asdas/dev/uradom2>和-
/dev/uradom
的提示,正如您所看到的,
grep
在打印失败时继续
grep:/asdas:没有这样的文件或目录
@basin实际上,使用
2>/dev/null
可以实现相同的效果,这样做的优点是没有闭合的标准FD。这很重要,因为默认情况下,第一个
open
使用的是最低的未使用FD,这可能会在脚本文件中发生奇怪的事情。
sh -c date 2>&1 | cat
exec -- {*}$argv >@stdout 2>@stderr