Node.js 打开MacOS终端窗口并执行命令
我正在开发一个使用Electron构建的内部工具,该工具运行各种NodeJ和shell脚本 我想打开默认的MacOS终端窗口并运行命令。我知道NodeJSNode.js 打开MacOS终端窗口并执行命令,node.js,electron,macos-mojave,Node.js,Electron,Macos Mojave,我正在开发一个使用Electron构建的内部工具,该工具运行各种NodeJ和shell脚本 我想打开默认的MacOS终端窗口并运行命令。我知道NodeJSchild\u process函数,如spawn()、fork()、和exec()用于其他目的,但在某些情况下,我更喜欢打开桌面操作系统终端窗口,因为命令输出很复杂,包括尾部日志、,在应用程序启动后,可能希望控制终端的开发者将使用它 我尝试将exec()和spawn()与open-a Terminalas一起使用,但它没有打开Terminal窗
child\u process
函数,如spawn()
、fork()
、和exec()
用于其他目的,但在某些情况下,我更喜欢打开桌面操作系统终端窗口,因为命令输出很复杂,包括尾部日志、,在应用程序启动后,可能希望控制终端的开发者将使用它
我尝试将exec()
和spawn()
与open-a Terminal
as一起使用,但它没有打开Terminal窗口
我目前有一个基于以下内容的解决方案:
import {exec} from "child_process";
import os = require("os");
export function openTerminal(cmd: string) {
if (os.platform() !== 'darwin') throw new Error('Not supported');
const command = [
`osascript -e 'tell application "Terminal" to activate'`,
`-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down'`,
`-e 'tell application "Terminal" to do script "${cmd}" in selected tab of the front window'`
].join(" ");
const child = exec(command, (error, stdout, stderr) => {
if (error) {
console.error(error);
alert("Unable to open Terminal window, see dev console for error.");
}
});
child.on("exit", (code) => console.log("Open terminal exit"));
}
这是可行的,但也存在一些问题:
- 最初,不允许Electron应用程序(使用
构建)运行此命令,并提示用户“此应用程序想要控制您的计算机”。如果用户接受该对话框,命令和后续命令仍然无法打开终端窗口。他们必须进入操作系统安全/可访问性设置,解锁管理员权限,将应用程序设置为允许控制,关闭应用程序,然后重新打开。那么它可能会起作用Electron packager
- 在工作条件下(见上文),需要很长时间才能看到窗口
- 如果终端已经打开(通常情况下),它通常(但并非总是)无法在新窗口中运行命令,相反,它将复制现有选项卡并在原始选项卡中运行命令,如果该选项卡已经运行命令,则可能无法工作。即使它确实可以工作,但这是不可取的,它应该在新选项卡(而不是现有选项卡)中运行该命令