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

时间:2015-06-11 22:33:21

标签: macos shell scripting executable desktop

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

2 个答案:

答案 0 :(得分:15)

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

否则,将脚本打包在.app包中是微不足道的。 Mac OS X将很乐意运行任何标识为应用程序可执行文件的脚本。

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

  • (名称)。应用程序
    • 目录
      • 的MacOS
        • (名称)

名为(name)的文件是您的脚本(必须可执行,必须具有shebang行)。 (name)在.app目录和脚本文件中必须相同:例如,如果您的app目录被调用" My Shell Script.app",则必须调用MacOS目录中的文件&# 34;我的Shell脚本",无扩展名

如果这样做不方便,可以使用Info.plist文件指定备用可执行文件名。 Info.plist进入目录目录:

  • Wrapper.app
    • 目录
      • 的Info.plist
      • 的MacOS
        • 的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目录和类似的东西重现标准的可执行包布局。

答案 1 :(得分:1)

尽管这可行,但似乎无法从脚本访问目录目录。它没有将环境变量传递给bash或我可以找到的其他任何地方。由于bash脚本似乎无法访问内容,因此很难将内容捆绑到Contents目录中。网上有各种各样的骇客,但是它们都涉及通过名称有效地搜索脚本,这意味着如果在两个地方有两个版本的应用程序,则它将失败。 有人解决吗?