macos - 将 Shell 脚本转换为 *.app 文件

标签 macos shell scripting executable desktop

使用 Automator.app 和 Platypus.app,我已经能够捆绑我创建的一个简单的 shell 脚本,以在 MacBook Pro 上重新启动 wi-fi。生成的两个应用程序都可以正常运行,但有一个我想纠正的明显问题:应用程序从程序外部引用 shell 脚本。如何嵌入 shell 脚本并从应用程序的资源中引用它,以便即使原始源文件被移动,应用程序也可以运行?

最佳答案

顺便提一下,如果您获取脚本的信息,您可以将其设置为使用终端打开。这将在您双击脚本时运行该脚本。

否则,将脚本打包到 .app 包中就很简单了。 Mac OS X 将愉快地运行任何被标识为应用程序可执行文件的脚本。

至少,您需要遵循以下结构:

  • (名称).app
    • 内容
      • Mac操作系统
        • (姓名)

其中名为 (name) 的文件是您的脚本(必须是可执行的,并且必须有一个 shebang 行)。 .app 目录和脚本文件中的 (name) 必须相同:例如,如果您的应用程序目录名为“My Shell Script.app”,则 MacOS 目录中的文件必须名为“My Shell Script”,其中无扩展名

如果这不方便,可以使用 Info.plist 文件来指定备用可执行文件名称。 Info.plist 位于 Contents 目录中:

  • 包装器.app
    • 内容
      • 信息.plist
      • Mac操作系统
        • MyScript

如果您在属性列表中将 MyScript 指定为 CFBundleExecutable,则此结构(名为 Wrapper.app 的包装器中的 MyScript 可执行文件)将起作用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string>MyScript</string>
</dict>
</plist>

使用 Info.plist 文件可能更好,因为这将允许您重命名包装器而不破坏它。

这是一个使用 /bin/sh 作为解释器的示例脚本,但您实际上可以拥有任何内容(#!/usr/bin/swift, #!/usr/bin/python 等)。

#!/bin/sh
open -a Calculator

该脚本将在您双击应用程序包时运行。

您可以将您需要的任何其他内容与 Contents 目录中的脚本捆绑在一起。如果您喜欢,您可以使用 Resources 目录和类似的东西来重现标准可执行包布局。

关于macos - 将 Shell 脚本转换为 *.app 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30792569/

相关文章:

git - 在没有 ssh 的情况下,在 shell 脚本中指示 git pull 的密码?

macos - 如何使用命令行工具为 Mac OS X 创建美观的 DMG?

从 URL 下载 Windows 批处理文件文件

macos - 菜单栏未显示在 Android Studio 中

iphone - OSX SDK/Carbon 中的保留关键字,但 iOS 中没有。在联合 iOS/OSX 项目中做什么?

macos - 10.7 和 10.8 的 NSSplitView 问题

arrays - 如何使用关联数组并与索引数组匹配?

Ruby:使用 'echo' 选项执行 shell 命令 '-n'

linux - 用于连接到远程服务器并提取上次修改文件时间的 Bash 脚本

python - 在 Python 中获取当前脚本的名称