无法从命令读取输出:标准输出已重定向 - TCL

can't read output from command: standard output was redirected - TCL

我正在尝试从另一个 TCL 文件执行一个 TCL 文件。 示例:FileA.tcl 正在执行 FileB.tcl

FileA.tcl 有这些命令:

open {|FileB.tcl >& FileB.log &}  #Executing FileB as a background process

我收到此错误消息:can't read output from command: standard output was redirected.

还有如何获取文件描述符?

一般来说,父进程和子进程之间通常使用三个文件描述符进行通信。这些是子进程的 stdinstdoutstderr(理论上可以有其他的,但它完全是非标准的)。

默认情况下,如果您执行 exec THING,则 stdin 来自 /dev/null(或等效于 Windows),stdout 是管道连接回父进程,将成为 exec 的结果,而 stderr 是连接回父进程的管道,将成为 exec 产生的错误(如果什么都写在那里)。

如果末尾有&,则子进程运行与父进程断开连接; stdout 默认转到父级的真实 stdoutstderr 默认转到父级的真实 stderr.

如果您使用 open |(它使用与 exec 相同的子进程启动引擎),那么您可以自己控制更多。特别是,当 open | 处于读取模式(默认)时,stdin 仍然来自 /dev/null,但 stdoutopen | 结果的管道并且 stderr 被收集并且当你 close 主管道时会产生错误。 (如果你想控制 stdin 那么你需要一个非默认的打开模式,如果你使用读写模式打开,你可以让东西双向。双向管道可能有点棘手缓冲和一点需要注意避免阻塞,因为所有的零碎部分都是半独立运行的。)

所有这些都由您使用的重定向修改。

the documentation 的相关部分是:

<b>>&</b> <i>fileName</i>
Both standard output from the last command and standard error from all commands are redirected to the file named fileName, overwriting its previous contents.

If the last arg is "&" then the pipeline will be executed in background. In this case the exec command will return a list whose elements are the process identifiers for all of the subprocesses in the pipeline. The standard output from the last command in the pipeline will go to the application's standard output if it has not been redirected, and error output from all of the commands in the pipeline will go to the application's standard error file unless redirected.


在你的情况下,你有:

open {|FileB.tcl >& FileB.log &}

这是纯读取模式(stdin 默认来自 /dev/null)并且 stdoutstderr 都重定向到一个文件。并且有背景。这意味着那里没有管道可供读取,也根本无法与子进程交互(除了使用进程 ID,如果你能得到的话)。 open 拒绝;它要return你个烟斗!如果您想要这样一个断开连接的子进程,请使用 exec.

exec FileB.tcl >& FileB.log &