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


233

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

Answers:


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

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

  • 在这里,选择您要执行文件的应用程序,在这种情况下,它将是Terminal。为了能够选择终端,您需要从“推荐的应用程序”切换到“所有应用程序”。(可以在“实用工具”文件夹中找到Terminal.app应用程序)

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

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

谢谢,我知道了,我不知道要与终端关联,我认为需要与/ bin / sh关联
c2h2 2011年

22
在意识到必须在“实用程序”文件夹中查找之前,我无法在列表中找到Terminal.app。希望这可以节省一些时间。
Glenn Lawrence 2015年

27
在OSX 10.8或更高版本,可执行脚本的名字有两种后缀或后缀.command默认的搜索可执行文件,而无需指示搜索如何打开它。
mklement0

1
“所有应用程序”是我所缺少的环境……也许是Cheruvim所经历的。至于格伦的评论:您可以简单地使用窗口右上角的内置搜索功能;确保输入应用程序的全名,即Terminal.app。
年长者

3
不是干净的方法。将您的脚本重命名为.command文件扩展名。
Bachsau

227

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


3
这个更好。在@Lus答案中,工作文件夹与您打开脚本的文件夹不同。
罗德里戈(Rodrigo)2012年

6
有没有没有控制台窗口的“后台”任务启动方法?
lapo 2012年

6
请注意,当前目录可能不是一个脚本位于看看这个问题,设置正确:stackoverflow.com/questions/59895/...
帕维尔Alexeev

14
您仍然需要具有执行权限(chmod +x),但.command扩展名已与Terminal链接。伟大的解决方案,谢谢您
NorTicUs 2014年

显然,用户无法使用此方法与终端程序进行交互-除非我弄错了?
Demis

153

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

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

[1] 可执行文件是指:脚本,其中设置了可执行权限,并且调用用户(相对于文件的所有权)因此可能被允许执行。
如果使用chmod a+x设置的所有权限位(这是典型的),任何人都可以调用它(假设他们也被允许阅读基础上的文件读取权限位(S)和文件的所有权)。


1
退出脚本时可以关闭打开的“终端”窗口,方法很简单,osascript您可以将其包含在.command文件中,而不必手动弄乱配置文件。
l'l'l

@ I'L'I:您的意思是osascript -e '...'在一个脚本的末尾添加一个命令吗?具体命令是什么,即使脚本不在最前面的选项卡中运行,它也可以确保关闭右侧的选项卡吗?
mklement0

5
@ mklement0:是的,我已经花了几分钟没有测试它,但是基本的想法是在.command脚本的最后一行中添加: osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &...尽管在结束是真正的关键-可以轻松修改osascript(例如,如果这是您的终端默认行为,则可能需要将window更改为tab)。
l'L'l

.command尽管配置文件设置已运行脚本文件,但是否有可能不让终端窗口/选项卡关闭?
Cyber​​Mew

@Cyber​​Mew:如果可以修改脚本,请添加一条命令,等待最后的击键;例如,如果是bash脚本,则添加read -p 'Press Return to close this window.'为最后一条语句。
mklement0 '18

38

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


这是一个非常棒的应用程序。但是我这里有些问题。我有一个想要转换为.app文件的python脚本。我的脚本包括一行,用户必须键入一些输入(raw_input()),当.app到达此行代码时,它将引发EOF(文件结尾)错误。我该怎么办?

1
它不是交互式终端。鸭嘴兽只呈现脚本输出。没有双向通信。
svth

4
或使用“运行Shell脚本”操作使用Automator创建OS X应用程序。
Rangi Keen

15

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

但这将打开终端,您将不得不关闭它。如果您不希望看到任何输出,则可以使用Automator创建Mac应用程序,您可以双击该应用程序,然后将其添加到扩展坞中,等等。

  1. 公开Automator申请
  2. 选择“应用程序”类型
  3. 在“操作”搜索框中键入“运行”
  4. 双击“运行Shell脚本”
  5. 单击右上角的Run按钮进行测试。
  6. File > Save 创建应用程序。

在此处输入图片说明


太好了!我们如何使该工作流程自动化以每天下午1点运行?
iAkshay

9

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

只需使用脚本编辑器创建一个Apple脚本,并将该命令do shell script "shell commands"用于直接命令调用或可执行的Shell脚本文件,将可编辑脚本文件放在安全的位置,然后将其导出以创建应用程序脚本即可。双击或在bar文件夹中选择即可启动该应用程序脚本。


3
更好的是,使用Automator并直接使用“运行Shell脚本”操作,而不是通过Apple Script。
Rangi Keen


0

chmod 774 filename

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.