在OSX Automator shell脚本中运行Grunt

3

我有一个简单的Gruntfile,希望能够从我的OSX dock图标运行。

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

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

这个脚本也可以使用以下的shebang:#!/bin/bash

但是,当我从Automator工作流中调用shell脚本时,会出现以下错误:

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

这是我的Automator设置:

enter image description here

我做错了什么?
更新 如果我将以下内容放入我的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

现在当我在自动化程序中运行它时,仍然会弹出一个错误提示框,但是它没有任何细节 - 它只说:

The action "Run Shell Script" encountered an error.

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

更新3

所以这很奇怪……如果我使用 &> ~/log,它就可以工作。没有它就会失败。

但是这个方法可行,感谢 @mklement0,现在先这样吧。

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

6
问题在于从 Automator 运行时,$PATH 变量的条目与从终端运行时不同。

值得注意的是,/usr/local/bin 缺失,这通常是安装 grunt(如果是全局安装)的位置。
一个简单的解决方法是在 Automator shell 脚本的顶部添加 grunt 所在的文件夹到你的 $PATH 中。
PATH="/usr/local/bin:$PATH"
~/Public/Sites/Launcher.sh

除此之外:
  • 您的shell命令 $(grunt serve --open) 只需要 grunt serve --open 即可 - 不需要使用命令替换符号 ($(...)`...`), 因为这将实际上先执行命令,然后再尝试执行该命令的输出。

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

  • 如果shell脚本以非零的退出代码退出,则Automator会报告错误; 错误消息将包含shell脚本的stderr输出(以及仅此)- 在您的情况下似乎没有产生stderr输出。

    • 为了诊断目的捕获所有输出,请使用类似于 ./launcher.sh &> ~/log 的命令

在macOS 10.11至少到10.15(截至此更新时间),$PATH 在从Automator workflow启动的shell脚本中具有以下值:/usr/bin:/bin:/usr/sbin:/sbin


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