运行 来自 OSX Automator shell 脚本的 Grunt

Running Grunt from OSX Automator shell script

我有一个简单的 G运行t 文件,我希望能够从 OSX 停靠栏中的图标 运行。

我创建了一个非常简单的 shell 脚本 (launcher.sh),我将其另存为应用程序,以便将其添加到我的停靠栏中。当我直接在我的终端中 运行 它时效果很好:

#!/usr/bin/env bash
$(grunt serve --open)

它也适用于这个 shebang:#!/bin/bash

然而,当我从 Automator 工作流程调用 shell 脚本时,出现以下错误:

launcher.sh: line 2: grunt: command not found

这是我的 Automator 设置:

我做错了什么?


更新

如果我将其放入我的 launcher.sh 文件中:

#!/bin/bash
`/usr/local/bin/grunt serve --open`

我在 Automator 中遇到不同的错误:env: node: No such file or directory

但是,和以前一样,如果我直接在终端中 运行 脚本就可以了 - 所以我认为 @mklement0 关于 PATH

是正确的

更新 2

launcher.sh

#!/bin/bash
grunt serve --open

自动化

PATH="/usr/local/bin:$PATH"
~/Public/Sites/launcher.sh

现在我在 Automator 中 运行 时仍然收到错误弹出窗口,但它没有详细信息 - 它只是说:

The action "Run Shell Script" encountered an error.

“日志”面板显示一个空白条目。有没有办法获得更多信息?也许是详细模式?

更新 3

所以这很奇怪...如果我使用 &> ~/log 它会起作用。没有它就失败了。

但这是有效的,谢谢@mklement0,现在就可以了

PATH="/usr/local/bin:$PATH"
cd ~/Public/Sites && ./launcher.sh &> ~/log

问题是从 Automator 运行ning 时的 $PATH 变量与从终端 运行ning 时的条目不同。

值得注意的是,缺少 /usr/local/bin,这是通常安装 grunt 的地方(如果 全局安装 )。

一个简单的解决方法是在 Automator shell 脚本的顶部将安装 grunt 的文件夹添加到您的 $PATH

PATH="/usr/local/bin:$PATH"
~/Public/Sites/Launcher.sh

除此之外:

  • 您的 shell 命令 $(grunt serve --open) 应该只是 grunt serve --open - 不需要命令替换($(...)`...`), 因为这实际上会首先执行命令 and 然后尝试从该命令执行 output.

  • 默认工作目录。当从 Automator 运行ning 一个 shell 脚本是 ~(您的主文件夹)时,这可能不是您的脚本所期望的;看起来你的脚本需要它自己的目录。作为工作目录,所以使用 cd ~/Public/Sites && ./launcher.sh 调用它。

  • 如果 shell 脚本以 nonzero 退出代码退出,Automator 将报告错误;错误消息将包括 shell 脚本的 stderr 输出(仅此而已)- 听起来您的情况没有产生 stderr 输出。

    • 要捕获 all 输出以用于诊断目的,请使用类似 ./launcher.sh &> ~/log
    • 的内容

在 macOS 10.11 至至少 10.15(截至本次更新),$PATH 在来自 Automator 工作流程的 shell 脚本 运行 中具有以下值:/usr/bin:/bin:/usr/sbin:/sbin