popen 不会读取 xterm 窗口(或可能的其他终端)中显示的输出,因此该部分不清楚。但是,您说这可以在终端窗口中使用。
另一个问题是运行xterm所需的DISPLAY变量可能没有在finder运行的环境中设置。您可以通过在命令行中添加合适的-display 选项来解决那个。例如,如果您的应用程序正在本地机器上运行并显示(可能),您可以尝试
popen("xterm -display :0.0 -e ' some bash script ' ","r");
从 xterm 捕获输出时,需要考虑两种类型的输出:
- 来自 xterm 本身的错误消息被写入标准错误
- 在 xterm 中运行的程序,例如
'some bash script',将写入 xterm 窗口。
对于您的示例,您可以捕获管道中的错误消息(来自popen,直接通过将命令中的标准错误重定向到 xterm 的标准输出,例如,
popen("xterm -display :0.0 -e ' some bash script ' 2>&1 ","r");
捕获 bash 脚本的输出更难。您可以重定向 bash 脚本本身的输出,例如,
popen("xterm -display :0.0 -e ' some bash script >mylogfile ' ","r");
但这会干扰交互。更好的解决方案可能是使用script 程序,执行如下操作:
popen("xterm -display :0.0 -e script mylogfile ' some bash script ' ","r");