【问题标题】:Mac OS X app running shell script but no terminal windowMac OS X 应用程序运行 shell 脚本但没有终端窗口
【发布时间】:2021-12-13 08:28:09
【问题描述】:

我是 Mac OSX 的新手,我正在尝试创建一个 .app 文件以在 Applications 文件夹中运行。我正在使用 MacOS Big Sur,它只会在 Mac 上运行(它不需要是跨平台的)。有一个通过运行 shell 脚本来执行的 jar 文件,以及一些额外的资源文件,所以最终我想将它们捆绑在一个 dmg 之类的东西中,以便我可以轻松地与其他一些人共享它.

我按照herehere 的建议进行了设置,几乎一切正常。该程序在我双击 .app 文件时启动,但没有终端窗口。不幸的是,我需要打开终端窗口,因为我用它来向用户记录消息。

终端是 shell 脚本的默认应用程序,当我通过双击直接运行 shell 脚本时会打开一个终端。该脚本文件使用 .sh 扩展名并且没有扩展名,但如果脚本具有 .sh 扩展名,我在尝试运行 .app 时遇到错误。一切都有执行权限。我浏览了 Info.plist 文档,但找不到有关终端的任何信息。我也尝试使用 Automator 创建 .app,但结果相同。

任何建议都将不胜感激,因为目前我完全陷入困境。正如我所说,最终我希望有一种方法与可能不太精通计算机的其他人分享这个(例如,他们习惯于从 App Store 下载东西并且无法使用命令安装东西线)。因此,如果我要解决这一切都错了,或者有更简单的方法,那么也请告诉我。

【问题讨论】:

  • 命令行程序不运行 Terminal.app,Terminal.app 运行命令行程序(或者更专业地说,Terminal.app 运行一个 shell,而 that 运行其他命令行程序)。如果您的应用需要运行带有终端界面的命令行程序,您的应用需要提供该界面,或者告诉终端打开并运行命令行程序(可能通过 AppleScript?) .
  • 是的,这是我的问题:如何让应用程序打开终端并运行命令行程序。它现在可以正常运行程序,但它没有打开终端,我需要它

标签: macos shell terminal


【解决方案1】:

不幸的是,我需要打开终端窗口,因为我使用它来向用户记录消息。

如果这就是您想要终端应用程序的全部,那么您就不需要全部了。

终端应用程序是一个 GUI 应用程序,它使用标准操作系统调用运行 shell,通过管道将键盘输入传递给该 shell(以及因此它依次调用的任何命令),并读取 shell 的输出(因此. ..) 并将其显示在窗口中。

您可以直接从您自己的应用程序运行您的 shell 脚本,收集输出,然后在您的应用程序的一个窗口中显示该输出。

在 Objective-C 中,您要查找的类是 NSTask,用于运行一个将您的 shell 脚本传递给它的 shell,以及 NSPipe,用于创建所需的管道。

SO 上有很多关于 NSTask/NSPipe 的问答,这里是 one,这里是使用 Swift 的 another

请注意,在将输出转换为可以在窗口中显示或以其他方式处理的字符串之前,上述两者都读取了输出的全部。这不是必需的,如果您有一个长时间运行的 shell 脚本并希望在它运行时显示输出,您可以从管道中读取较短的块。阅读文档以了解如何执行此操作。

【讨论】:

  • 非常感谢您的建议,但不幸的是,在这种情况下这对我不起作用。实际上,我是从事这个项目的一个小型程序员团队的一员,添加类似的功能会对他们和应用程序产生太大影响。这超出了我现在要做的范围。
【解决方案2】:

我将发布我的解决方案,以防将来对任何人有所帮助。正如 cmets/answers 所说,我真正需要知道的是如何让我的应用程序打开终端窗口。显然,通过手动创建应用程序(创建文件夹结构和最小的 Info.plist),我遗漏了一些关键元素。

我尝试使用 Xcode 生成一个。我敢肯定这很简单,但我在尝试编写 Swift 代码时陷入了困境。

对我有用的是使用脚本编辑器创建 AppleScript。该脚本只是告诉终端程序运行我的 bash 脚本:

tell application "Terminal"
   do script "/Applications/{name of app}/Contents/MacOS/run.sh;exit"
end tell

关键是脚本编辑器可以将它作为应用程序保存到应用程序文件夹中,这意味着它会创建必要的文件夹结构和文件。之后,我可以将我的程序文件复制到 MacOS 文件夹中,这是我的 bash 脚本查找所有内容的地方。

【讨论】:

    【解决方案3】:

    一种选择可能是给脚本文件扩展名.command,例如,然后open,例如:

    open myscript.command
    

    myscript.command 文件需要执行权限 (chmod a+x myscript.command)。

    这些.command文件也可以在Finder中双击以在新的终端窗口中执行。

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 2017-01-17
      • 2015-07-14
      • 1970-01-01
      • 2013-11-18
      • 2016-06-22
      • 2011-03-02
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多