我想在我当前的Node.js程序中有一个条件,它将从占用命令提示符退出并改为打开另一个命令行应用程序。
实现这一目标的过程是什么?
答案 0 :(得分:1)
如果您只想打开另一个终端,您可以简单地生成一个新的终端进程。您的特定Linux发行版使用哪个终端必须弄清楚,但为了回答这里,我将使用xterm。您可以通过以下命令生成进程:
var spawn = require('child_process').spawn;
var oTerminalProcess = spawn("xterm", []);
现在,您将弹出另一个终端,该终端应该可以让您访问您需要做的任何事情。稍后您可以使用以下命令关闭该过程:
oTerminalProcess.kill();
您可能希望使用spawn而不是exec,因为exec在子进程输出后会出现缓冲区溢出问题> 200 kB(http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)
当然所有这些都假设某种GUI桌面类型环境。如果你想在GUI没有运行时从一个控制台完成所有这些操作,那将是一个完全不同的问题。
如果这是你想要做的,你将不得不附加事件监听器来处理stdin(http://nodejs.org/api/process.html#process_process_stdin)并直接推送到stdout并使用exec自己模拟一个终端。这并不是非常困难,但我可以想象,对于特殊情况,细节可能会变得毛茸茸。它可能看起来像这样(我在节点0.8.21上进行了测试,它对我有用):
var exec= require('child_process').exec;
process.stdin.resume();
process.stdin.setEncoding('utf8');
var sInputBuffer = "";
process.stdout.write("$Prompt: ");
process.stdin.on('data', function(chunk) {
sInputBuffer += chunk;
if(chunk === "quit\n")
{ process.stdin.pause();
}
else
{
exec(sInputBuffer, function(error, stdout, stderr){
if(stdout.length > 0)
{ process.stdout.write(stdout); }
else
{ process.stdout.write(stderr); }
sInputBuffer = "";
process.stdout.write("\n$Prompt:");
});
}
});
注意我已经设置了“退出”杀死程序或在你的情况下杀死接受输入的stdin流。您必须克服的一个问题可能是拦截ctrl-c命令。现在,这会杀死整个节点,但您可能希望它简单地终止您正在执行的命令。那肯定会有更多的工作,但是你无法克服。
无论如何,这应该会为您提供几种选择。希望这会有所帮助。