如何通过双击在OS X中运行一个shell脚本?

282

我有一个在OS X上具有用户执行权限的Shell脚本,但当我双击它时,它会在文本编辑器中打开。如何才能让我通过双击来运行它?

8个回答

321
  • 首先在终端中输入以下命令,使脚本可执行:

  chmod a+x yourscriptname
然后,在Finder中,右键单击您的文件,选择“打开方式”,然后选择“其他...”。 在此处,您可以选择要将文件执行到的应用程序,在本例中为Terminal。要选择终端,您需要从“推荐应用程序”切换到“所有应用程序”。 (Terminal.app应用程序可以在实用程序文件夹中找到) 请注意,除非您不想将所有具有此扩展名的文件关联到终端中运行,否则不应选中“始终使用此应用程序打开”。 单击“确定”后,您应该能够通过双击脚本来执行它。

31
直到我意识到需要在“实用工具”文件夹中查找,我才在列表中找到Terminal.app。希望这能节省其他人一些时间。 - Glenn Lawrence
45
在OSX 10.8及以上版本中,没有后缀名或以.command为后缀名的可执行脚本,在Finder中默认情况下可以直接运行,无需指示Finder如何打开它。 - mklement0
1
“所有应用程序” 是我缺失的设置……可能 Cheruvim 也遇到了同样的问题。至于 Glenn 的评论:你可以直接使用窗口右上角内置的搜索功能;确保你输入应用程序的完整名称,即 Terminal.app。 - elder elder
9
这不是一个干净的方法。将你的脚本重命名为“.command”文件扩展名。 - Bachsau
1
这个脚本可以工作,但它总是将我的终端窗口置于前台。有没有办法在不将终端窗口置于前台的情况下完成这个操作?或者从一开始就将脚本放在后台运行的方法? - Tango
显示剩余5条评论

281

你尝试过使用.command文件扩展名吗?


3
这样会更好。在 @Lus 的回答中,工作文件夹与您打开脚本的文件夹不同。 - Rodrigo
9
有没有一种方法可以启动“后台”任务而不弹出控制台窗口? - lapo
8
请注意,当前目录可能不是您的脚本所在的目录。参考这个问题来设置它: https://dev59.com/yXVD5IYBdhLWcg3wL4cA - Pavel Alexeev
22
你仍需要拥有执行权限(chmod +x),但 .command 扩展名已经与 Terminal 相关联。非常好的解决方案,谢谢。 - NorTicUs
1
用户似乎无法通过这种方法与终端程序进行交互 - 除非我错了? - Demis
显示剩余2条评论

197

自OSX 10.10(Yosemite)以来,并且至少从OS X 10.8(Mountain Lion)开始,当您从Finder打开(双击)可执行脚本时的行为如下:

  • 具有无后缀或后缀为.command可执行脚本[1]

    • 默认情况下无需设置即可执行

      • 一个新的终端窗口将打开,其中运行脚本。
      • 默认情况下,脚本终止后窗口将保持打开,以便您检查输出(尽管此时运行脚本的 shell 已退出,您不能再与其交互)。
        但是,通过终端的首选项... > 配置文件,您可以选择在脚本退出时自动关闭窗口。
    • 注意:工作目录始终是当前用户的主目录,而不是脚本所在的文件夹。

      • 要使 shell 脚本更改为其所在的文件夹,请将
        • cd -- "$(dirname "$BASH_SOURCE")"放在 shebang 行之后
        • 或者,如果必须保持 POSIX 兼容性,则使用cd -- "$(dirname "$0")"
        • 对于边缘情况,例如查找符号链接的脚本的真实源目录,请参见this answer
    • 如果脚本意外地不可执行

      • 在终端中运行chmod +x <script>使其可执行;否则,您将看到以下症状:

        • .command:Finder 显示一个误导性的错误消息,建议通过文件 > 获取信息来解决问题,这是不正确的 - 使用上面建议的chmod +x方法。

        • 无后缀:

          • 带有 shebang 行(例如,#!/bin/bash):行为就像后缀为.sh一样-请参见下文。
          • 没有 shebang 行:打开默认文本编辑器(默认情况下为TextEdit)。
  • 具有后缀.sh的脚本,无论是否可执行:

    • TextEdit.app或(如果已安装)Xcode.app打开以进行编辑
  • 具有后缀.scpt.applescript的脚本(即使它们本身被标记为可执行,这通常不是情况):

    • 在[Apple]Script Editor打开以进行编辑
    • 请注意,JXA源代码文件似乎没有明显的后缀名(但)。
  • 具有自定义后缀的脚本(系统尚未知道的后缀),无论是否可执行(实际上适用于任何类型的文件):

    • 提示选择打开它们的应用

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


1
可以通过在.command文件中包含简单的osascript代码而不是手动更改配置文件来关闭脚本退出时打开的终端窗口。 - l'L'l
@I'L'I:您是指在脚本末尾添加osascript -e '...'命令吗?具体的命令是什么,它是否确保即使脚本不在最前面的选项卡中运行,也能关闭正确的选项卡? - mklement0
5
是的,我只测试了几分钟,但基本思路是在 .command 脚本的最后一行包含:osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &...它可能不适用于所有情况,尽管最后的重定向是关键,否则 osascript 可以很容易地进行调整(例如,如果你的终端默认行为是选项卡,则 window 可能需要更改为 tab)。 - l'L'l
2
在配置文件设置的情况下,是否有可能在运行.command脚本文件后不让终端窗口/选项卡关闭? - CyberMew
@mklement0,请看一下https://apple.stackexchange.com/questions/335608。谢谢。 - Royi
显示剩余4条评论

39

或者,您可以使用Platypus从脚本创建Mac OS X应用程序。


这是一个非常棒的应用程序。但我在这里遇到了一些问题。我有一个Python脚本,我想将其转换为.app文件。我的脚本包括一行代码,用户需要输入一些内容(raw_input()),当.app到达此代码行时,它会抛出EOF(文件结尾)错误。我该怎么办? - user2015601
1
这不是一个交互式终端。Platypus仅呈现脚本输出。没有双向通信。 - svth
5
可以使用 Automator 中的“运行 Shell 脚本”操作创建一个 OS X 应用程序。 - Rangi Keen

24

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

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

  1. 打开Automator应用程序
  2. 选择“应用程序”类型
  3. 在操作搜索框中输入“run”
  4. 双击“运行 shell 脚本”
  5. 点击右上角的Run按钮进行测试。
  6. 文件>保存以创建应用程序。

输入图像描述


太好了!我们如何自动化这个工作流程,每天下午1点运行一次? - iAkshay
你可以在将扩展名更改为.command后,按照本文的第三步执行此文章中的操作:https://medium.com/@nooneypradeep/double-click-to-execute-a-shell-script-in-mac-os-monterey-3-steps-2f6f80939f48 - Pradeep Nooney
请确保将文件格式更改为“应用程序”,否则您将得到一个“工作流程”,它只会打开Automator。 - Brad Turek

10
无需使用像Platypus等第三方应用程序。

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


4
更好的方法是使用 Automator 直接运行 Shell 脚本,而不是通过 Apple Script。 - Rangi Keen

0

你也可以使用RCDefaultApp按文件扩展名设置默认值:

http://www.rubicode.com/Software/RCDefaultApp/

潜在地,您可以将.sh 设置为在 iTerm/Terminal 等中打开。它需要用户执行权限,例如:
chmod u+x filename.sh

RCDefaultApp pref pane


0

chmod 774 filename

注意:文件名为“filename”的bash脚本文件没有扩展名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接