回答
如果你想要做的只是打开另一个终端,你可以简单地产生一个新的终端进程。您的特定Linux发行版使用哪个终端将需要弄清楚,但出于回答的目的,我将使用xterm。您可以通过以下命令产卵过程:
var spawn = require('child_process').spawn;
var oTerminalProcess = spawn("xterm", []);
现在你会弹出打开另一个终端应该给你访问做任何你需要做的。您可以稍后在关闭过程中使用以下命令:
oTerminalProcess.kill();
你可能会想用产卵,而不是高管,因为Exec将有子进程后输出缓冲区溢出问题> 200 KB(http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)
当然,所有这些都假定某种GUI桌面类型的环境。如果您想在GUI未运行时从单个控制台执行此操作,那将会是一个完全不同的问题。
如果这是你想做的事,你将不得不附加事件侦听器来处理标准输入(http://nodejs.org/api/process.html#process_process_stdin),并直接推到标准输出,并使用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:");
});
}
});
注意我有它设置为“跳槽”查杀程序或在您的情况查杀标准输入流接受输入。你必须克服的一个问题可能是拦截ctrl-c命令。现在它杀死了整个节点,但是你可能希望它只是简单地杀掉正在执行的命令。这肯定会有更多的工作,但没有什么是你无法克服的。
无论如何,这应该会给你一些选择。希望这可以帮助。
看起来不错,(我正在使用后一种情况,没有涉及GUI)。我想知道如果我只是将子进程传递到当前节点进程中,并且我同意这是一个非常好管理的解决方案。感谢您向我展示您的方式,并指出exec vs spawn的警告! – DanF
我注意到在你的第二个例子中,你使用exec代替了spawn,在你指出exec的200kb最大输出之后。产卵可以用于相同的效果,但没有输出限制? – DanF
编写第二个例子时我的假设是单个控制台命令不会溢出200 kB缓冲区。不过,我想你不一定要依靠那个。但你绝对可以使用产卵并解决这个限制。知道何时以这种方式再次输出提示以获得更多用户输入会更困难。 。 。 – Brian
- 1. 如何在Python中退出程序时打开另一个程序?
- 2. 打开终端进程退出后,不能接入终端再次
- 3. 如何从node.js打开终端应用程序?
- 4. 打开新的终端,SSH远程主机并运行一个程序来远程host.All输出要在新打开终端
- 5. 打开终端时出错
- 6. 如何关闭表单,退出所有过程并打开另一个表单
- 7. TCL - 打开一个新终端,在已打开的终端上执行一些操作并关闭它
- 8. 从另一个程序中打开一个应用程序
- 9. 折叠一个div并打开另一个引导程序
- 10. 打开终端
- 11. 在第二个终端配对后的PiTooth.py程序中,另一个终端的程序仍在“等待连接”
- 12. 从另一个中打开另一个JavaFX应用程序?
- 13. 如果不退出ssh_tunnel,请打开新的终端
- 14. python 3打开终端并运行程序
- 15. 从终端打开一个matlab gui
- 16. 如何从终端打开一个URL
- 17. SharedPreferences除非第一个应用程序退出并重新打开
- 18. 打开另一个终端显示信息
- 19. Node.js process.exit()不会退出,并且createReadStream打开
- 20. 当另一个终端窗口打开时创建两个进程?
- 21. 打开与另一个程序
- 22. 打开一个进程,获取输出,然后打开另一个进程并获得输出
- 23. 在git终端中退出bash
- 24. 如何在终端中退出命令
- 25. Link tap打开Android浏览器并退出应用程序
- 26. 如何在java中打开终端窗口并执行客户程序
- 27. Mac终端进程完成退出
- 28. 无法打开在终端
- 29. 打开终端/提示并通过一个命令(ping)
- 30. 在另一个应用程序中打开一个Android应用程序
您的运行node.js进程不知道“命令行”是什么。它运行在cpu上,并将其stdout和stderr数据发送到“Somewhere”,通过命令行界面调用它意味着命令行界面。你能否解释为什么你需要这样做,以便我们明白你想要达到的目标,而不是你认为你应该达到的目标? –
我想制作一个Node程序,它将成为一个非常简单的Linux机器的启动界面,以展现一些非常简单的功能。有人告诉我,编辑/ etc/inittab是改变计算机启动的方式,但我想包括一个选项,用于从该提示中打开一个普通的BASH shell,以便有时展示全部功能。 – DanF
不确定从执行的角度来看是否有意义。你可以让它产生一个进程,但是它会被节点进程“拥有”,所以如果这个进程死了,你的产生进程就会随之死亡。将节点作为启动界面运行的想法听起来很奇怪,但后来我没有所有的细节。 –