Node.js 打开MacOS终端窗口并执行命令

Node.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窗

我正在开发一个使用Electron构建的内部工具,该工具运行各种NodeJ和shell脚本

我想打开默认的MacOS终端窗口并运行命令。我知道NodeJS
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
    构建)运行此命令,并提示用户“此应用程序想要控制您的计算机”。如果用户接受该对话框,命令和后续命令仍然无法打开终端窗口。他们必须进入操作系统安全/可访问性设置,解锁管理员权限,将应用程序设置为允许控制,关闭应用程序,然后重新打开。那么它可能会起作用

  • 在工作条件下(见上文),需要很长时间才能看到窗口

  • 如果终端已经打开(通常情况下),它通常(但并非总是)无法在新窗口中运行命令,相反,它将复制现有选项卡并在原始选项卡中运行命令,如果该选项卡已经运行命令,则可能无法工作。即使它确实可以工作,但这是不可取的,它应该在新选项卡(而不是现有选项卡)中运行该命令

有没有办法从Electron打开MacOS中的终端窗口以避免这些问题