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

2024-01-08

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


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

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

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

  • (name).app
    • Contents
      • MacOS
        • (name)

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

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

  • Wrapper.app
    • Contents
      • 信息表
      • MacOS
        • MyScript

如果您将 MyScript 指定为CFBundleExecutable在属性列表中:

<?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, etc).

#!/bin/sh
open -a Calculator

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Shell 脚本转换为 *.app 文件 的相关文章

随机推荐

  • .NET 垃圾收集器之谜

    在我的工作中 我们遇到了 OutOfMemoryExceptions 问题 我编写了一段简单的代码来模仿某些行为 最终得到了以下谜团 看看这段简单的代码 当内存不足时 它就会崩溃 class Program private static v
  • 高分子纸波纹

    我试图在按下按钮时更改元素的颜色 我希望当按下按钮并且颜色发生变化时在该元素中触发纸张波纹效果 我该怎么做呢 目标元素
  • 充当文件上传的div?

    我只是想上传或浏览 div 本身 就像作为文件输入并触发其功能 但我的问题是我对 java 脚本很陌生 并且为自己集思广益近一个小时并寻找互联网上同样的问题 所以我别无选择只能在这里提问 my code div style border 1
  • Android AsyncTask 与进度对话框取消

    在我的android应用程序中 我使用带有进度对话框的AsyncTask 请等待登录 来使用我的网页 异步任务内的Web服务功能 登录用户 当用户单击设备上的 后退 按钮时 我想关闭进度对话框并取消 AsynTask 我找不到用于中断 As
  • Swift - 从 JSON 响应创建数据模型

    我正在学习 Swift 语言 很高兴听到其他人输入的内容之一是 如何处理来自 JSON 响应的模型 例如 I have User swift model class User NSObject var user token String v
  • 自动分配spring的bean名称以防止名称冲突?

    在Spring应用程序中 如果两个程序员开发两个包 将 Repository注释为相同的类名 Spring将抛出 IllegalStateException 注解指定的bean名称 mybean 代表 bean 类 foobar packa
  • 如何从 URL 方案中获取参数。

    我在我的 iPhone 应用程序中使用 URL 方案 从一个页面将用户切换到 safari 然后从网页单击一个按钮 我将恢复到应用程序 此时 一些参数是由网页传递的 例如 myapp parameter 1 如何从我的应用程序中找到此参数
  • jQuery.ajax -always() 并不总是运行

    我正在使用 jQuery ajax 进行 REST 调用并检索一些 JSON 它按预期工作 但是 当我强制出现错误条件 例如无效 URL 时 always 方法不会触发 如果我设置 crossDomain false 或 dataType
  • Linux 文件 IO - 多线程性能 - 写入不同的文件

    我目前正在开发一个音频录制应用程序 该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘 简化的 现在 每个流都由一个线程处理 gt 同一线程还在磁盘上执行保存工作 这意味着我有 8 个不同的线程在同一磁盘上执行写入操作 每个线程写入不
  • 有没有办法区分应用程序是在登录时由启动服务启动还是由用户启动? [复制]

    这个问题在这里已经有答案了 Cocoa 应用程序可以将自己添加到LSSharedFileList的登录项目列表 这将允许应用程序在用户登录时启动 但是 有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动 这很有用 因为在一种情况下
  • MacOS Mojave 中未找到 ntpdate 命令

    我有一个 Bash 脚本可以更新我的 mac 时间 但自从 Mojave 更新后找不到该命令 ntpdate u time apple com return ntpdate command not found 我哪里出错了 这是重复的 请检
  • 在python中将文件从latin1转换为utf-8的最快方法

    我需要在 python 中将文件从 latin1 转换为 utf 8 的最快方法 文件很大 2G 我正在移动数据库数据 到目前为止我已经 import codecs infile codecs open tmpfile r encoding
  • ED A0 80 ED B0 80 是有效的 UTF-8 字节序列吗?

    java nio charset Charset forName utf8 decode http docs oracle com javase 7 docs api java nio charset Charset html decode
  • Java:方法名称/签名解析是否静态完成(编译时)?

    今天我遇到了一个有趣的问题 我认为这在 Java 中是不可能的 我针对 jgroups 2 6 版本编译了 java 代码 但在运行时使用了 2 12 版本 tomcat Web 应用程序部署 我收到以下错误 org jgroups Mes
  • 使 HTA 文件以管理员身份运行(提升)

    在 wsf vbs 和 js 文件中 您可以轻松地找出它们是否运行提升 如果没有 您可以轻松地制作它们 我为此编写的代码是这样的 EnsureElevatedPrivileges WScript Echo Running elevated
  • 反序列化以在运行时键入

    我正在尝试使用TypeAdapterFactory序列化和反序列化一些客户对象 我想在运行时将所有对象序列化为特定类型 所以给定一个String classpath and a JsonObject object我想将对象反序列化为实例Cl
  • C# - 方法的类型签名与 PInvoke 不兼容

    我正在尝试在 C 2010 中使用 VC 2003 dll 当我从 C 调用 dll 的方法时出现此错误 方法的类型签名与 PInvoke 不兼容 I am returning the structure from VC Code stru
  • longjmp 是如何工作的?

    我需要了解 longjmp 函数是如何工作的 我知道它的作用 但我需要知道它是如何做到的 我试图在 gdb 中禁用代码 但我无法理解一些步骤 代码是 0xb7ead420
  • 设置 boost socket.connect 的超时

    我在用boost asio connect on a tcp socket 当一切顺利时 connect立即返回 但在网络较差的情况下 connect日志等待 15 秒后超时 我不能等那么久 所以想减少超时 不幸的是 到目前为止我还没有找到
  • 将 Shell 脚本转换为 *.app 文件

    使用 Automator app 和 Platypus app 我已经能够捆绑我创建的一个简单的 shell 脚本 以在 MacBook Pro 上重新启动 wi fi 生成的两个应用程序都可以正常运行 但有一个我想纠正的明显问题 应用程序