使用 Automator.app 和 Platypus.app,我已经能够捆绑我创建的一个简单的 shell 脚本,以在 MacBook Pro 上重新启动 wi-fi。生成的两个应用程序都可以正常运行,但有一个我想纠正的明显问题:应用程序从程序外部引用 shell 脚本。如何嵌入 shell 脚本并从应用程序的资源中引用它,以便即使原始源文件被移动,应用程序也可以运行?
最佳答案
顺便提一下,如果您获取脚本的信息,您可以将其设置为使用终端打开。这将在您双击脚本时运行该脚本。
否则,将脚本打包到 .app 包中就很简单了。 Mac OS X 将愉快地运行任何被标识为应用程序可执行文件的脚本。
至少,您需要遵循以下结构:
- (名称).app
- 内容
- Mac操作系统
- (姓名)
- 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/