如何通过双击在 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
脚本文件后不关闭终端窗口/选项卡,尽管有配置文件设置?
@CyberMew:如果可以修改脚本,在最后添加一个等待击键的命令;例如,如果是 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 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
Jackmoore Zoom 1.7.15:通过双击在触摸设备上切换缩放