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

Posted

技术标签:

【中文标题】如何通过双击在 OS X 中运行 shell 脚本?【英文标题】:How to run a shell script in OS X by double-clicking? 【发布时间】:2011-07-04 19:08:54 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

  chmod a+x yourscriptname

然后,在 Finder 中,右键单击您的文件并选择“打开方式”,然后选择“其他...”。

您可以在此处选择要在其中执行文件的应用程序,在本例中为终端。为了能够选择终端,您需要从“推荐应用程序”切换到“所有应用程序”。 (Terminal.app 应用程序可以在 Utilities 文件夹中找到)

请注意,除非您不想将所有文件与此扩展名关联以在终端中运行,否则不应选中“始终打开方式”。

单击“确定”后,您只需双击即可执行脚本。

【讨论】:

谢谢我知道了,我不知道与终端关联,我认为需要与/bin/sh关联 我无法在列表中找到 Terminal.app,直到我意识到我必须查看“实用程序”文件夹。希望这可以节省一些时间。 在 OSX 10.8 及更高版本上,名称具有 no 后缀或后缀 .command 的可执行脚本默认情况下可从 Finder 中执行,不带需要指示 Finder 如何打开它。 “所有应用程序”是我缺少的设置......可能 Cheruvim 也经历过。至于格伦的评论:您可以简单地使用窗口右上角的内置搜索功能;确保输入应用程序的全名,即 Terminal.app。 不是干净的方法。将您的脚本重命名为 .command 文件扩展名。【参考方案2】:

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

【讨论】:

这样更好。在@Lus 回答中,工作文件夹与您打开脚本不同。 有没有办法在没有控制台窗口的情况下启动“后台”任务? 请注意,当前目录可能不是您的脚本所在的目录。请查看此问题以正确设置:***.com/questions/59895/… 您仍然需要拥有执行权限 (chmod +x) 但 .command 扩展名已经与终端链接。很好的解决方案,谢谢 显然用户不能用这种方法与终端程序交互——除非我弄错了?【参考方案3】:

从 OSX 10.10(优胜美地)开始,至少 OS X 10.8(Mountain Lion),当您从 Finder 中打开(双击)可执行脚本时,行为如下:

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

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

【讨论】:

脚本退出时可以关闭打开的终端窗口,使用简单的osascript 可以包含在.command 文件中,而不是手动弄乱配置文件。 @I'L'I: 你的意思是在脚本末尾添加osascript -e '...' 命令吗?具体命令是什么,是否保证即使最前面的标签没有运行脚本也能关闭右边的标签? @mklement0:是的,我已经测试了几分钟,但基本思想是在 .command 脚本的最后一行包含:@ 987654343@ ... 它可能不适用于所有场景,尽管最后的重定向确实是关键 - osascript 可以很容易地调整(例如,window 可能需要更改为 tab 如果这是您的终端默认行为等)。 是否可以在运行.command 脚本文件后不关闭终端窗口/选项卡,尽管有配置文件设置? @Cyber​​Mew:如果可以修改脚本,在最后添加一个等待击键的命令;例如,如果是 bash 脚本,则添加 read -p 'Press Return to close this window.' 作为最后一条语句。【参考方案4】:

或者,您可以使用 Platypus 从您的脚本创建一个常规的 Mac OS X 应用程序

【讨论】:

这是一款非常棒的应用。但是我这里有一些问题。我有一个要转换为 .app 文件的 python 脚本。我的脚本包含一行用户必须输入一些输入 (raw_input()),当 .app 到达这行代码时,它会引发 EOF(文件结尾)错误。我该怎么办? 它不是交互式终端。 Platypus 仅提供脚本输出。没有双向通信。 或者使用 Automator 使用 Run Shell Script 操作创建一个 OS X 应用程序。【参考方案5】:

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

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

    打开Automator 应用程序 选择“应用程序”类型 在操作搜索框中输入“运行” 双击“运行 Shell 脚本” 点击右上角Run按钮进行测试。 File > Save 创建应用程序。

【讨论】:

太棒了!我们如何使这个工作流程自动化,使其每天下午 1 点运行? 或者您可以在将扩展名更改为 .command 后执行本文中的第三步 https://medium.com/@nooneypradeep/double-click-to-execute-a-shell-script-in- mac-os-monterey-3-steps-2f6f80939f48【参考方案6】:

无需使用鸭嘴兽等第三方应用。

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

【讨论】:

更好的是,使用 Automator 并直接使用 Run Shell Script 操作,而不是通过 Apple Script。【参考方案7】:

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

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

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

chmod u+x filename.sh

【讨论】:

【参考方案8】:

chmod 774 filename

注意:带有 bash 脚本的名为 'filename' 的文件没有扩展名

【讨论】:

以上是关于如何通过双击在 OS X 中运行 shell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

从 OS X Dock 执行 Shell 脚本?

Mac上如何运行shell脚本(变为可执行文件)

c# devexpress 双击在两个网格之间传输数据

Jackmoore Zoom 1.7.15:通过双击在触摸设备上切换缩放

linux下创建一个脚本,双击后,点“在终端中执行”没反映,但点运行脚本执行,请问是为啥?

如何在 OS X 上将进程窗口置于前台?