如何从 C++ 应用程序打开 osx 上的 xterm?
how to popen xterm on osx from c++ application?
我这样做:
popen("xterm -e ' some bash script ' ","r");
如果我从终端命令行启动我的应用程序,它工作正常。
但是如果我双击 finder 启动它(即非终端),应用程序运行,但 xterm 没有出现。
(xterm 在 osx 上可能不是正确的解决方案,我想做的是从 popen 打开一个终端,在终端内与用户交互,然后 return 结果这种与主程序的交互)
xterm 的 window(或可能的其他终端)中显示的输出不会被 popen
读取,因此该部分不清楚。但是,您说这适用于终端 window.
另一个问题是运行 xterm 所需的DISPLAY
变量可能没有在finder 为运行ning 的环境中设置。您可以通过向命令行添加合适的 -display
选项来解决 that 问题。例如,如果您的应用程序 运行 正在本地机器上显示(可能),您可以尝试
popen("xterm -display :0.0 -e ' some bash script ' ","r");
从 xterm 捕获输出时,需要考虑两种类型的输出:
- 来自 xterm 本身的错误消息被写入标准错误
- xterm 中的程序 运行ning,例如
'some bash script'
,将写入 xterm window.
对于您的示例,您可以通过将命令中的标准错误重定向到 xterm 的标准输出,直接从 popen
捕获管道中的错误消息,例如,
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");
我这样做:
popen("xterm -e ' some bash script ' ","r");
如果我从终端命令行启动我的应用程序,它工作正常。
但是如果我双击 finder 启动它(即非终端),应用程序运行,但 xterm 没有出现。
(xterm 在 osx 上可能不是正确的解决方案,我想做的是从 popen 打开一个终端,在终端内与用户交互,然后 return 结果这种与主程序的交互)
xterm 的 window(或可能的其他终端)中显示的输出不会被 popen
读取,因此该部分不清楚。但是,您说这适用于终端 window.
另一个问题是运行 xterm 所需的DISPLAY
变量可能没有在finder 为运行ning 的环境中设置。您可以通过向命令行添加合适的 -display
选项来解决 that 问题。例如,如果您的应用程序 运行 正在本地机器上显示(可能),您可以尝试
popen("xterm -display :0.0 -e ' some bash script ' ","r");
从 xterm 捕获输出时,需要考虑两种类型的输出:
- 来自 xterm 本身的错误消息被写入标准错误
- xterm 中的程序 运行ning,例如
'some bash script'
,将写入 xterm window.
对于您的示例,您可以通过将命令中的标准错误重定向到 xterm 的标准输出,直接从 popen
捕获管道中的错误消息,例如,
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");