从 OS X Dock 执行 Shell 脚本?

Posted

技术标签:

【中文标题】从 OS X Dock 执行 Shell 脚本?【英文标题】:Executing Shell Scripts from the OS X Dock? 【发布时间】:2010-09-21 20:03:25 【问题描述】:

如何设置 shell 脚本以从 Mac OSX 扩展坞执行?似乎只需创建一个快捷方式即可在我的编辑器中打开该文件。我需要在某处设置一个标志来告诉它运行而不是打开它进行编辑吗?

【问题讨论】:

应该只为头像 +1,虽然我也喜欢这个话题。 您可能需要考虑将接受的答案切换到第二个@Wilco。我认为这是一个更好的答案。 另见:How can I launch a script from the MacOS X dock? 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果您不需要终端窗口,您只需创建一个 shell 脚本 Example 并将其移动到文件名 Example.app/Contents/MacOS/Example 即可将任何可执行文件变成应用程序。您可以像任何其他应用程序一样将这个新应用程序放在您的 Dock 中,然后单击执行它。

注意:应用名称必须与脚本名称完全匹配。所以***目录必须是Example.appContents/MacOS子目录中的脚本必须命名为Example,并且脚本必须是可执行的。

如果您确实需要显示终端窗口,我没有简单的解决方案。你可能可以用 Applescript 做点什么,但这不是很干净。

【讨论】:

您不知道是否有一种简单的方法可以将文件作为参数传递给 shell 脚本?对于使用“打开方式...”打开的文件。 对于任何尝试这样做的人——应用程序的名称必须与脚本名称完全匹配。所以它真的必须是example.sh.app,而不仅仅是example.app。如果这些不匹配,您将收到有关损坏应用程序的警告 澄清一下——我是一个 OSX 菜鸟——你的意思是只创建一个文件夹结构,就像你的示例中显示的那样,并在其中放置如图所示的脚本文件? @martineau 是的,没错。如果您创建一个名称以.app 结尾并具有该结构的文件夹,它将被视为可执行应用程序。如果您想在 Finder 中查看该文件夹的内容,您需要右键单击它并选择“查看包内容”(因为双击它会运行应用程序)。在终端中,它只是一个文件夹。 (我不确定 Finder 是否会让您自行将文件夹重命名为 .app;您可能需要在终端中进行重命名。) 我刚刚尝试过,但在 El Capitan (10.11) 中收到错误消息:“您无法打开 .... 因为不再支持 powerpc 应用程序。” :D 这很有趣!【参考方案3】:

在脚本编辑器中:

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

另存为应用程序包。

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

【讨论】:

我建议:“另存为应用程序包”。捆绑包的启动速度比应用程序快得多。【参考方案4】:

在 OSX Mavericks 上:

    创建您的 shell 脚本。

    使您的 shell 脚本可执行:

    chmod +x your-shell-script.sh
    

    将您的脚本重命名为具有.app 后缀:

    mv your-shell-script.sh your-shell-script.app
    
    将脚本拖到 OSX 扩展坞。

    将您的脚本重命名为.sh 后缀:

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

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

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

【讨论】:

很好,这对我有用,任何方式都可以让我想知道这个图标。仅供参考:第 7 步也是指文件而不是菜单项... 好样的!只是所有带有打开终端的 .sh。 @stiemannkj1,这会在应用程序运行时显示图标吗?有什么办法可以隐藏吗? @Pacerier,对不起,我不再使用 OSX(切换到 Linux :))。您可能想尝试Jeremy Bank's answer。我没有任何其他想法,因为我没有 OSX,我无法测试或弄乱任何东西来尝试显示/隐藏图标.. 如果去掉 .sh 后缀,它将默认在 MacOS Catalina 的终端中运行。否则它将尝试在 XCode 中运行它。【参考方案5】:

有人写...

我只是将所有以“.sh”结尾的文件设置为使用终端打开。有用 很好,您不必更改每个 shell 脚本的名称 想跑。

【讨论】:

【参考方案6】:

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

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

这样做的好处是它真的很简单,您可以很容易地获得用户输入(例如,选择一堆文件),然后将其传递给 shell 脚本的输入(到标准输入,或作为参数)。

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

【讨论】:

@dbr,GUI 按钮按钮! :) 开个玩笑,这是个好建议! 是的,这是一个很好的建议 :) 我什至为我的一些应用程序编写了 Automator 操作,但在这种情况下我仍然会忘记它 :) 我无法让它与 nohup 一起使用,例如“nohup /usr/bin/myscript & ; disown -a && exit 0”。我需要应用程序/工作流来运行脚本并立即退出。有任何想法吗? :-) @martineau 如果您通过执行open -a SomeAppThing.app --args --etc=2 打开应用程序,它应该聚焦。或者,您可以使用 Applescript(例如 osascript -e 'tell application "Google Chrome" to activate')来关注它 注意:如果您的脚本正在启动一个 GUI 应用程序,该应用程序将保持打开一段时间,这将在任务栏中显示一个不断旋转的齿轮图标,直到应用程序关闭。一种解决方法是将 ` &>/dev/null &` 添加到脚本的启动行,这样 Automator 就不会等待。【参考方案7】:

正如 joe 所提到的,创建 shell 脚本,然后创建一个 applescript 脚本来调用 shell 脚本,将完成此操作,并且非常方便。

Shell 脚本

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

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

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

    保存 shell 脚本,例如“StartKeepass.sh”

苹果脚本

    打开 AppleScript Editor,调用 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 脚本,只在此处运行我的单声道命令) user name - 向 applescript 声明您希望以特定用户身份运行命令 "<enter username here> - 替换为您的用户名(保留引号),例如“josh” password - 向 applescript 声明您的密码 "<enter password here>" - 替换为您的密码(保留引号),例如“mypass” with administrative privileges - 声明你想以管理员身份运行

创建您的 .APP

    将你的 applescript 保存为 filename.scpt,在我的例子中是 RunKeepass.scpt

    另存为...你的applescript并将文件格式更改为应用程序,在我的情况下导致RunKeepass.app

    将您的应用文件复制到您的应用文件夹

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

太好了,谢谢!现在所有需要让它成为一个完美的解决方案的方法就是在脚本完成时关闭终端窗口。 好吧,如果您在终端首选项中选择了退出时关闭窗口,您可以将退出命令添加到您的脚本中,您将拥有您想要的。【参考方案9】:

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

如果您想要扩展名(如 foo.sh),您可以转到 Finder 中的文件信息窗口并更改该特定脚本的默认应用程序(TextEdit、TextMate、任何默认设置) .sh 文件)到终端。然后它将只执行而不是在文本编辑器中打开。同样,您必须将其拖到 Dock 的右侧。

【讨论】:

注意:这就像 OS X 10.10 Yosemite 中的冠军。我无法评论 10.9 适用于 10.11。谢谢! 也适用于 10.12!也许我对 10.9 的评论不正确,但我注意到您需要确保将其拖到分隔符下方的停靠部分。不幸的是,我无法重新测试 10.9。 无需将其添加到 Dock。它可以从桌面运行。但不能延长。使其可执行,您只需双击即可。这是我见过的最简单的选择。【参考方案10】:

我认为这个帖子可能会有所帮助:http://forums.macosxhints.com/archive/index.php/t-70973.html

换句话说,您可以使用 .command 扩展名重命名它,或者创建一个 AppleScript 来运行 shell。

【讨论】:

至少在 Snow Leopard 上,如果您双击脚本,添加 .command 扩展名可以使其在终端中运行,但由于某种原因,您仍然无法将其拖入扩展坞。不过,dbr 和 Jeremy 的建议都对我有用。

以上是关于从 OS X Dock 执行 Shell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

运行java程序的Mac shell脚本在dock中放了两个图标

在 OS X 中隐藏从 Dock 生成的 install4j 服务

XSLT可以在OS级别执行shell脚本吗?

删除 Mac OS X 中 shell 可执行文件的停靠图标?

在 Swing 中创建 Mac OS X 风格的 Dock Bar

从脚本中终止 android ASE shell