直接执行tclsh脚本与source脚本的C++输出行为差异问题
Tcl exec调用外部程序时直接运行脚本输出被抑制的解决办法
问题场景
我写了一个会在控制台打印消息的C++程序,代码如下:
#include<iostream> int main() { std::cout << "Testing c++ cout from tcl shell" << std::endl; return 0; }
然后编写了run.tcl脚本,用exec调用这个可执行文件:
exec ./a.out
但两种执行方式结果不同:
- 直接执行
tclsh run.tcl时,C++程序的控制台输出完全看不到; - 先启动tclsh交互控制台,再执行
source run.tcl时,输出能正常打印。
原因分析
Tcl的exec命令默认会捕获外部程序的标准输出。在交互模式下,Tcl会自动把exec返回的捕获内容打印到控制台;但在非交互模式(直接用tclsh运行脚本)下,捕获的输出如果没有被显式处理,就不会显示出来。
解决办法
有两种简单的处理方式:
方法1:让外部程序直接输出到控制台
修改exec命令,把外部程序的标准输出重定向到当前进程的标准输出,跳过捕获逻辑:
exec ./a.out >@stdout
方法2:捕获输出后显式打印
先把exec捕获到的输出存到变量里,再用puts命令主动打印出来:
set output [exec ./a.out] puts $output
两种方法各有适用场景:第一种适合需要实时输出或者输出内容较多的情况;第二种适合需要对输出内容进行后续处理的场景。
内容的提问来源于stack exchange,提问作者user2890240
相关产品推荐
相关产品推荐

