从 OSX Automator shell 脚本运行 Grunt

Dan*_*isp 3 macos bash shell automator

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

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

#!/usr/bin/env bash
$(grunt serve --open)
Run Code Online (Sandbox Code Playgroud)

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

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

launcher.sh: line 2: grunt: command not found
Run Code Online (Sandbox Code Playgroud)

这是我的 Automator 设置:

在此处输入图片说明

我究竟做错了什么?


更新

如果我把它放在我的launcher.sh文件中:

#!/bin/bash
`/usr/local/bin/grunt serve --open`
Run Code Online (Sandbox Code Playgroud)

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

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

更新 2

启动器.sh

#!/bin/bash
grunt serve --open
Run Code Online (Sandbox Code Playgroud)

自动机

PATH="/usr/local/bin:$PATH"
~/Public/Sites/launcher.sh
Run Code Online (Sandbox Code Playgroud)

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

The action "Run Shell Script" encountered an error.
Run Code Online (Sandbox Code Playgroud)

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

更新 3

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

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

PATH="/usr/local/bin:$PATH"
cd ~/Public/Sites && ./launcher.sh &> ~/log
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

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

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

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

PATH="/usr/local/bin:$PATH"
~/Public/Sites/Launcher.sh
Run Code Online (Sandbox Code Playgroud)

除此之外:

  • 您的 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 工作流运行的 shell 脚本中具有以下值:/usr/bin:/bin:/usr/sbin:/sbin