关于macos:如何通过双击在OS X中运行shell脚本?

How to run a shell script in OS X by double-clicking?

我有一个shell脚本,它在OSX上具有用户执行权限,但是当我双击它时,它会在文本编辑器中打开。如何通过双击使其运行?


  • 首先在终端中键入以下内容,使脚本可执行:

    1
    chmod a+x (yourscriptname)
  • 然后,在Finder中,右键单击您的文件,选择"打开方式",然后选择"其他…"。

  • 在这里,您可以选择要在其中执行文件的应用程序,在本例中,它是终端应用程序。要选择终端,您需要从"推荐应用程序"切换到"所有应用程序"。(可以在实用程序文件夹中找到terminal.app应用程序)

  • 请注意,除非您不想将所有文件与要在终端中运行的扩展名相关联,否则不应选中"始终打开"。

  • 单击"确定"后,您应该能够通过双击脚本来执行脚本。


您是否尝试过使用.command文件扩展名?


从OSX 10.10(Yosemite)开始,由于至少有OS X 10.8(Mountain Lion),当您从finder打开(双击)可执行脚本时,行为如下:

  • 可执行脚本[1]无后缀或后缀.command
    • 默认情况下执行-不需要设置:
      • 将打开一个新的终端窗口,脚本将在其中运行。
      • 默认情况下,在脚本终止后,窗口将保持打开状态,以便您可以检查输出(尽管此时运行脚本的shell已退出,并且您不能再与它交互)。但是,通过终端的Preferences... > Profiles,您可以选择在脚本退出时自动关闭窗口。
    • 警告:工作文件夹始终是当前用户的主文件夹,而不是脚本所在的文件夹。
      • 要将shell脚本更改为其所在的文件夹,请将
        • 在shebang线之后
        • 或者,如果您必须保持POSIX兼容,则cd --"$(dirname"$0")"
        • 对于边缘情况,例如查找符号链接脚本的真正源目录,请参见我的这个答案。
    • 如果脚本意外地不可执行:
      • 通过在终端中运行chmod +x 使其可执行;否则,您将看到以下症状:
      • .command:finder显示一条误导性错误消息,提示问题可以通过File > Get Info解决,这不是真的-使用上面建议的chmod +x方法。
      • 无后缀:
        • 使用shebang行(例如,#!/bin/bash):行为就像后缀是.sh-见下文。
        • 没有shebang行:在默认文本编辑器(默认为textedit)中打开。
  • 后缀为.sh的脚本,无论是否可执行:
    • TextEdit.app中打开进行编辑,如果安装了Xcode.app则打开进行编辑。
  • 后缀为.scpt.applescript的脚本(即使它们本身标记为可执行文件,通常情况下不是这样):
    • [Apple]Script Editor中打开编辑
    • 注意,JXA源代码文件似乎没有明显的后缀(还没有)。
  • 具有自定义后缀(系统尚不知道的后缀)的脚本,无论是否可执行(实际上,适用于任何类型的文件):
    • 当你第一次打开应用程序时,提示你打开它们,记住这个选择。

[1]可执行意味着:设置了可执行权限位的脚本和调用用户(相对于文件的所有权),因此可能允许执行它。如果使用chmod a+x设置所有权限位(这是典型的),任何人都可以调用它(假设他们也可以根据读取权限位和文件的所有权读取文件)。


或者,可以使用platypus从脚本创建常规的mac os x应用程序


简单的方法是将扩展更改为.command或不进行扩展。

但是这会打开终端,你必须关闭它。如果您不想看到任何输出,您可以使用Automator创建一个Mac应用程序,您可以双击、添加到Dock等。

  • 打开Automator应用程序
  • 选择"应用"类型
  • 在"操作"搜索框中键入"运行"
  • 双击"运行shell脚本"
  • 点击右上角的Run按钮进行测试。
  • 创建应用程序。
  • enter image description here


    无需使用第三方应用程序,如鸭嘴兽。

    只需使用脚本编辑器创建一个Apple脚本,并使用命令do shell script"shell commands"直接调用命令或可执行shell脚本文件,将可编辑脚本文件安全保存在某个地方,然后将其导出以创建应用程序脚本。应用程序脚本可以通过双击或在bar文件夹中选择来启动。


    还可以使用rcdefaultapp按文件扩展名设置默认值:

    http://www.rubicode.com/software/rcdefaultapp/

    您可能会将.sh设置为在iterm/terminal等中打开。它需要用户执行权限,例如

    1
    chmod u+x filename.sh

    RCDefaultApp pref pane