无法从命令读取输出:标准输出已重定向 - 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.
还有如何获取文件描述符?
一般来说,父进程和子进程之间通常使用三个文件描述符进行通信。这些是子进程的 stdin
、stdout
和 stderr
(理论上可以有其他的,但它完全是非标准的)。
默认情况下,如果您执行 exec THING
,则 stdin
来自 /dev/null
(或等效于 Windows),stdout
是管道连接回父进程,将成为 exec
的结果,而 stderr
是连接回父进程的管道,将成为 exec
产生的错误(如果什么都写在那里)。
如果末尾有&
,则子进程运行与父进程断开连接; stdout
默认转到父级的真实 stdout
而 stderr
默认转到父级的真实 stderr
.
如果您使用 open |
(它使用与 exec
相同的子进程启动引擎),那么您可以自己控制更多。特别是,当 open |
处于读取模式(默认)时,stdin
仍然来自 /dev/null
,但 stdout
是 open |
结果的管道并且 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
)并且 stdout
和 stderr
都重定向到一个文件。并且有背景。这意味着那里没有管道可供读取,也根本无法与子进程交互(除了使用进程 ID,如果你能得到的话)。 open
拒绝;它要return你个烟斗!如果您想要这样一个断开连接的子进程,请使用 exec
.
exec FileB.tcl >& FileB.log &
我正在尝试从另一个 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.
还有如何获取文件描述符?
一般来说,父进程和子进程之间通常使用三个文件描述符进行通信。这些是子进程的 stdin
、stdout
和 stderr
(理论上可以有其他的,但它完全是非标准的)。
默认情况下,如果您执行 exec THING
,则 stdin
来自 /dev/null
(或等效于 Windows),stdout
是管道连接回父进程,将成为 exec
的结果,而 stderr
是连接回父进程的管道,将成为 exec
产生的错误(如果什么都写在那里)。
如果末尾有&
,则子进程运行与父进程断开连接; stdout
默认转到父级的真实 stdout
而 stderr
默认转到父级的真实 stderr
.
如果您使用 open |
(它使用与 exec
相同的子进程启动引擎),那么您可以自己控制更多。特别是,当 open |
处于读取模式(默认)时,stdin
仍然来自 /dev/null
,但 stdout
是 open |
结果的管道并且 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
)并且 stdout
和 stderr
都重定向到一个文件。并且有背景。这意味着那里没有管道可供读取,也根本无法与子进程交互(除了使用进程 ID,如果你能得到的话)。 open
拒绝;它要return你个烟斗!如果您想要这样一个断开连接的子进程,请使用 exec
.
exec FileB.tcl >& FileB.log &