从OS X Dock执行Shell脚本?


160

如何设置要从Mac OSX扩展坞执行的Shell脚本?似乎简单地创建快捷方式将在我的编辑器中打开文件。我是否需要在某个地方设置一个标志来告诉它运行,而不是打开它进行编辑?


2
应该只为头像+1,尽管我也喜欢这个话题。
马特·班纳特

您可能需要考虑将接受的答案切换到第二个@Wilco。我认为这是一个更好的答案。
Gray

Answers:


190

您可以通过一个步骤创建Automator工作流程-“运行Shell脚本”

然后File > Save As,将“文件格式”更改为“应用程序”。当您打开应用程序时,它将运行Shell脚本步骤,执行命令,并在完成后退出。

这样做的好处是它确实非常简单,并且您可以非常容易地获得用户输入(例如,选择一堆文件),然后将其传递给Shell脚本的输入(传递给stdin或作为参数)。

(Automator在您的/Applications文件夹中!)

工作流程示例


6
@ dbr,GUI按钮推动器!:)开个玩笑,那是个好建议!
willasaywhat

是的,这是一个很好的建议:)我什至为某些应用程序编写了Automator操作,但在这样的时候我仍然忘记了它:)
Jason Coco,

我无法将其与nohup配合使用,例如“ nohup / usr / bin / myscript&; disown -a && exit 0”。我需要应用程序/工作流来运行脚本并立即退出。有任何想法吗?:-)
时分

3
@martineau如果通过执行打开应用程序,open -a SomeAppThing.app --args --etc=2则应重点关注。另外,您也可以使用Applescript(例如osascript -e 'tell application "Google Chrome" to activate')进行聚焦
-dbr

1
注意:如果脚本正在启动将持续打开一段时间的GUI应用程序,它将在任务栏中显示一个不断旋转的齿轮图标,直到该应用程序关闭。一种解决方法是在脚本的启动行中添加`&> / dev / null&`,以使Automator不必等待。
ewall

50

如果不需要“终端”窗口,只需创建一个shell脚本Example并将其移至filename 即可将任何可执行文件设置为Application Example.app/Contents/MacOS/Example。您可以将此新应用程序像放置其他应用程序一样放置在您的扩展坞中,然后单击以执行它。

注意:应用程序的名称必须与脚本名称完全匹配。因此必须是顶级目录,Example.app并且Contents/MacOS子目录中Example的脚本必须命名为,并且脚本必须是可执行的。

如果确实需要显示终端窗口,则没有简单的解决方案。您可能可以使用Applescript做一些事情,但这不是很干净。


1
您不会偶然知道是否有一种简单的方法可以将文件作为参数传递给Shell脚本吗?对于使用“打开方式为...”打开的文件。
Fuzzy76 2011年

9
对于任何尝试这样做的人-应用程序的名称必须与脚本名称完全匹配。因此,确实必须example.sh.app,而不仅仅是example.app。如果这些应用程序不匹配,您将收到有关损坏的应用程序的警告
Kip 2013年

1
要澄清一下-我是OSX菜鸟-您的意思是仅创建一个文件夹结构(如示例中所示),并在其中放置脚本文件,如图所示?
martineau 2014年

2
@martineau是的,这是正确的。如果创建名称.app以该结构结尾的文件夹,该文件夹将被视为可执行应用程序。如果要在Finder中查看该文件夹的内容,则需要右键单击它并选择“查看包内容”(因为双击它会运行该应用程序)。在终端中,它似乎只是一个文件夹。(我不确定Finder是否会让您自己将文件夹重命名为.app;您可能需要在终端中进行重命名。)
Jeremy Banks

1
我只是尝试这样做,却在El Capitan(10.11)中收到以下错误:“您无法打开...。因为不再支持powerpc应用程序。” :D这很有趣!
2015年

26

在OSX Mavericks上:

  1. 创建您的shell脚本。
  2. 使您的shell脚本可执行:

    chmod +x your-shell-script.sh
  3. 重命名脚本以使其具有.app后缀:

    mv your-shell-script.sh your-shell-script.app
  4. 将脚本拖到OSX扩展坞。
  5. 将脚本重命名为.sh后缀:

    mv your-shell-script.app your-shell-script.sh
  6. 右键单击Finder中的文件,然后单击“获取信息”选项。
  7. 在窗口底部,将Shell脚本设置为与终端一起打开。

现在,当您单击扩展坞中的脚本时,将弹出一个终端窗口并执行您的脚本。

奖励:要在脚本完成后关闭终端,请添加exit 0到末尾,然后将终端设置更改为“如果干净退出则关闭外壳”,就像在此SO答案中所说的那样。


很好,这对我有用,以任何方式让我想知道的图标都碰运气。仅供参考:同样,第7步引用的是文件而不是菜单项...
Mike Q

方式不错!带有打开终端的所有.sh文件。
iHTCboy'9

@ stiemannkj1,在应用程序运行时是否显示图标?反正有隐藏吗?
佩里耶

@Pacerier,对不起,我不再使用OSX(切换到Linux :))。您可能需要尝试Jeremy Bank的答案。我没有任何其他的想法,因为我没有OSX,我无法测试或惹任何尝试和显示/隐藏图标..
stiemannkj1

17

我知道这很旧,但如果对其他人有帮助的话:

如果您需要运行脚本并希望弹出终端以查看结果,可以像Abyss Knight所说的那样将扩展名更改为.command。如果双击它,它将打开一个终端窗口并运行。

但是,我需要它从automator或appleScript运行。因此,要使它打开新的终端,我从“运行shell脚本”运行的命令是“ open myShellScript.command”,它在新的终端中打开。


太好了,谢谢!现在,所有需要使其成为一个完美解决方案的人将是一种在脚本完成时关闭终端窗口的方法。
彼得M

1
如果您在终端首选项中选择了关闭退出窗口,那么可以将exit命令添加到脚本中,您将拥有所需的内容。
杰森·特霍尔斯特鲁普

7

只要您的脚本是可执行的并且没有任何扩展名,您都可以按原样将其拖动到Dock的右侧(文档侧),并且单击该脚本将在终端窗口中运行,而不用打开编辑器。

如果您想要扩展名(如foo.sh),则可以转到Finder中的文件信息窗口,并从该脚本的任何内容(TextEdit,TextMate,在计算机上为.sh文件)到终端。然后它将只执行而不是在文本编辑器中打开。同样,您必须将其拖动到Dock的右侧。


1
注意:这就像OS X 10.10 Yosemite中的冠军。我无法评论10.9
Bryan Ash

1
适用于10.11。谢谢!
Yassine Imounachen's

也适用于10.12!也许我对10.9的评论是不正确的,但我注意到您需要确保将其拖动到分隔符下方的停靠栏部分。不幸的是,我无法重新测试10.9。
stiemannkj1,2013年

无需将其添加到Dock。它可以从桌面运行。但是不能扩展。使它可执行,您可以双击。这是我见过的最简单的选择。
Rich Apodaca

5

我认为该线程可能会有所帮助:http : //forums.macosxhints.com/archive/index.php/t-70973.html

换句话讲,您可以使用.command扩展名将其重命名,或者创建一个AppleScript来运行该Shell。


至少在Snow Leopard上,如果您双击脚本,则在脚本中添加.command扩展名使其可以在终端中运行,但是由于某些原因,您仍然无法将其拖动到扩展坞中。dbr和Jeremy的建议对我都有效。
Jo Liss 2010年

5

如joe所述,创建外壳程序脚本,然后创建一个applescript脚本来调用该外壳程序脚本即可完成此任务,并且非常方便。

Shell脚本

  1. 在您喜欢的文本编辑器中创建Shell脚本,例如:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (使用mono框架运行w32可执行文件)

  2. 保存外壳脚本,例如我的示例“ StartKeepass.sh”

苹果脚本

  1. 打开AppleScript编辑器,然后调用shell脚本

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script -applescript命令来调用外部shell命令
    • "sh ...." -这是在第一步中创建的Shell脚本(完整路径)(您也可以运行直接命令,我可以省略Shell脚本,只在此处运行我的mono命令)
    • user name -向applescript声明您要以特定用户身份运行命令
    • "<enter username here> -用您的用户名(保留引号)代替“乔什”
    • password -向applescript声明您的密码
    • "<enter password here>" -用“ mypass”代替您的密码(保留引号)
    • with administrative privileges -声明您要以管理员身份运行

创建您的.APP

  1. 将您的applescript保存为filename.scpt,在我的情况下为RunKeepass.scpt

  2. 另存为...您的applescript并将文件格式更改为application,在我的情况下导致RunKeepass.app

  3. 将您的应用程序文件复制到您的应用程序文件夹


5

在脚本编辑器中:

do shell script "/full/path/to/your/script -with 'all desired args'

另存为应用程序捆绑包。

只要您要做的就是获得脚本的效果,就可以正常工作。您将不会看到STDOUT或STDERR。


2
我建议:“另存为应用程序捆绑包”。捆绑软件的发布速度比应用程序快得多。
e.James

-3

有人写...

我只是将所有以“ .sh”结尾的文件设置为使用终端打开。它工作正常,您不必更改要运行的每个Shell脚本的名称。

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.