从OS X Dock执行Shell脚本?

185

我该如何设置一个 shell 脚本,让它能够从 Mac OSX dock 执行?似乎只是创建一个快捷方式会在我的编辑器中打开文件。是否需要在某处设置标志以告诉它运行而不是用编辑器打开呢?


2
应该只为头像点赞,虽然我也喜欢这个话题。 - Matt Bannert
你可能想考虑将采纳答案切换到第二个,@Wilco。我认为这是一个更好的答案。 - Gray
12个回答

217
您可以创建一个只有一个步骤的自动化流程 - "运行Shell脚本"。
然后选择 文件 > 另存为,并将文件格式更改为 "应用程序"。当您打开该应用程序时,它将运行 Shell 脚本步骤,执行命令,并在完成后退出。
这样做的好处是非常简单易行,并且您可以非常轻松地获取用户输入(例如,选择一堆文件),然后将其传递给 Shell 脚本的输入(可以作为 stdin 或参数)。
(自动化流程位于您的 /应用程序 文件夹中!)
(示例工作流程如下图所示:Example workflow

7
@dbr,GUI 按钮推动者!:) 开玩笑的,那是一个好建议! - willasaywhat
我有一个脚本,它使用一些命令行参数启动GUI应用程序,并使用此技术将其转换为Automator“应用程序”。它运行良好,但我想知道是否还有一些方法可以将焦点转移到启动的应用程序。 - martineau
3
如果你使用 open -a SomeAppThing.app --args --etc=2 命令打开这个应用程序,它应该会聚焦。或者你也可以使用苹果脚本来聚焦它(例如 osascript -e 'tell application "Google Chrome" to activate')。 - dbr
谢谢,open 命令正好满足需求。 - martineau
2
注意:如果您的脚本启动了一个GUI应用程序,并且该应用程序将保持打开状态一段时间,那么它将在任务栏中显示一个不断旋转的齿轮图标,直到应用程序关闭。一个解决方法是在脚本的启动行中添加“&>/dev/null &”,这样Automator就不会等待了。 - ewall
显示剩余8条评论

59
如果你不需要一个终端窗口,你可以通过创建一个shell脚本Example, 并将其移动到文件名Example.app/Contents/MacOS/Example来将任何可执行文件转换为一个应用程序。你可以像其他应用程序一样将这个新的应用程序放置在Dock中,并通过点击运行它。 注意:应用程序的名称必须与脚本名称完全匹配。因此,顶级目录必须是Example.appContents/MacOS子目录中的脚本必须命名为Example,并且该脚本必须是可执行的。
如果你确实需要显示终端窗口,我没有一个简单的解决方案。你可能可以使用Applescript做些什么,但这并不是很干净。

2
你不知道是否有一种简单的方法可以将文件作为参数传递给shell脚本吗?对于使用“打开方式...”打开的文件。 - Fuzzy76
11
对于任何试图完成这个操作的人,应用程序的名称必须与脚本名称完全匹配。因此,名称必须是 example.sh.app,而不仅仅是 example.app。如果名称不匹配,您将收到一个关于损坏应用程序的警告。 - Kip
1
澄清一下——我是一个OSX新手——你的意思是只需创建一个文件夹结构,就像你的示例中所示,将脚本文件放在其中吗? - martineau
4
@martineau 是的,那是正确的。如果您创建一个以 .app 结尾并具有相应结构的文件夹,则会将其视为可执行应用程序。如果您想在Finder中查看该文件夹的内容,您需要右键单击它并选择“查看包内容”(因为双击它将运行该应用程序)。在终端中,它将只显示为一个文件夹。(我不确定Finder是否会让您自己将文件夹重命名为 .app;您可能需要在终端中进行重命名。) - Jeremy
2
我刚尝试了一下,在El Capitan(10.11)中收到了一个错误:“您无法打开....,因为不再支持PowerPC应用程序。” :D 这非常有趣! - AllenH
显示剩余11条评论

51

在OSX Mavericks中:

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

    chmod +x your-shell-script.sh
    
    将您的脚本重命名为具有 .app 后缀的名称:
  3. mv your-shell-script.sh your-shell-script.app
    
  4. 将脚本拖到OSX dock上。
  5. 将你的脚本重命名为.sh后缀:

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

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

奖励:为了在脚本完成后关闭终端,请在结尾添加exit 0,并像此SO答案中所述更改终端设置为“如果干净退出则关闭shell”。


太好了!只需在终端中打开所有.sh文件。 - iHTCboy
@stiemannkj1,这会在应用程序运行时显示图标吗?有没有办法隐藏它? - Pacerier
2
如果您删除.sh后缀,它将默认在MacOS Catalina终端中运行。否则,它将尝试在XCode中运行。 - vwvan
如果在第2步将图标放在脚本上... 初始情况下,图标将在dock中为空[第4步],但在第一次运行后[第7步],图标将出现在dock中[在Big Sur上测试过]。 - MichaelR
1
超棒的技巧!当你移除.sh时它能够工作。你可以通过打开cmd+i(信息框)并将照片拖到其中来添加程序图标。 - Wim den Herder
显示剩余2条评论

19

我知道这个问题很老,但如果对其他人有用:

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

然而,我需要从自动化或者AppleScript中运行这个脚本。因此,为了让这个脚本在新的终端中打开,我从“运行shell脚本”中运行了以下命令:“open myShellScript.command”,它将在一个新的终端中打开。


太棒了,谢谢!现在想要让它成为完美的解决方案的唯一需要就是找到一种在脚本完成后关闭终端窗口的方法。 - Peter M
1
如果你在终端偏好设置中选择了“退出时关闭窗口”,那么你可以在脚本中添加退出命令,就能实现你想要的效果。 - Jason Tholstrup

8
只要你的脚本是可执行文件,且没有任何扩展名,你可以将其直接拖到Dock的右侧(文档区),当点击该文件时,它将在终端窗口中运行,而不是打开编辑器。
如果你想要一个带有扩展名的文件(如foo.sh),你可以在Finder中打开该文件的详细信息窗口,并将该特定脚本的默认应用程序从当前应用(如TextEdit、TextMate或其他在你的电脑上为.sh文件设置的默认应用)更改为Terminal。然后它就会被执行,而不是打开文本编辑器。同样,你需要将它拖到Dock的右侧。

1
注意:这在OS X 10.10 Yosemite上运行得非常好。我无法评论10.9。 - Bryan Ash
1
可以在10.11上运行。谢谢! - Yassine Imounachen
也适用于10.12!也许我关于10.9的评论是不正确的,但我注意到您需要确保将其拖到分隔符下方的dock的部分。很遗憾,我无法重新测试10.9。 - stiemannkj1
不需要将其添加到Dock中,它可以从桌面运行。但是不能有扩展名。将其设置为可执行文件,然后您只需双击即可。这是我见过的最简单的选项。 - Rich Apodaca

6
在脚本编辑器中: do shell script "/full/path/to/your/script -with 'all desired args' 保存为应用程序包。
只要你想要的是获得脚本的效果,这种方法就可以正常工作。你看不到标准输出或标准错误。

2
我建议:将其保存为应用程序包。与应用程序相比,应用程序包启动速度更快。 - e.James

5

在Snow Leopard上,将.command扩展名添加到脚本中使其在终端中运行(如果双击它),但出于某种原因,您仍然无法将它拖入坞。dbr和Jeremy的建议对我都起作用了。 - Jo Liss

5
如Joe所提到的,创建一个shell脚本,然后创建一个AppleScript脚本调用这个shell脚本,将实现此目的,而且很方便。
Shell脚本
1. 在您喜欢的文本编辑器中创建您的Shell脚本,例如:
``` mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe" ```
(这将使用Mono框架运行w32可执行文件)
2. 保存Shell脚本,比如我的例子是 "StartKeepass.sh"。
Apple Script
1. 打开AppleScript Editor,并调用shell脚本。
``` do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "" password "" with administrator privileges ```
- `do shell script`:调用外部Shell命令的AppleScript命令。 - `"sh ...."`:这是您在步骤一中创建的Shell脚本的完整路径(也可以直接运行命令,我可以省略Shell脚本并在此处直接运行Mono命令)。 - `user name`:声明要作为特定用户运行命令。 - `""`:替换为您的用户名(保持引号),例如 "josh"。 - `password`:声明您的密码。 - `""`:替换为您的密码(保持引号),例如 "mypass"。 - `with administrative privileges`:声明要以管理员身份运行。
创建您的.APP
1. 将您的AppleScript保存为filename.scpt,如我的例子是RunKeepass.scpt。 2. "另存为..." 您的AppleScript并将文件格式更改为应用程序,结果是一个RunKeepass.app,如我的例子。 3. 将应用程序文件复制到您的应用程序文件夹。

2

在macOS Monterey 12.3中实现该目标的确切步骤

  1. 打开 Automator
  2. 文件 -> 新建
  3. 选择 应用程序
  4. 进入 -> 实用工具
  5. 双击 运行Shell脚本
  6. 输入您想要运行的任何命令。例如,尝试切换到暗模式的命令:
osascript -e 'tell app "System Events" to tell appearance preferences to set dark mode to not dark mode'
  1. 文件 -> 保存
  2. 将保存的文件拖动到Dock中即可完成!

1
简单明了的回答! - Organic Advocate

0

pip install mac-appify

我对接受的解决方案感到困惑,但这个命令对我有用。

安装

pip install mac-appify

运行

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/appify ~/bin/webex_start.sh ~/Desktop/webex.app

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