如何在Node-RED exec node命令中转义空格

情况:

在我的Node-REDstream程中,有一个调用另一个程序的地方,我使用了exec节点。 参数在函数节点中设置,并作为msg.payload传递给exec节点。 这工作正常,并返回预期的结果,只要命令没有空间。

问题:

客户不能使用对他的系统上的命令的调用,因为程序的安装path包含一个空格。

我尝试过但没有工作:

  1. 在另一个问题中读取与^的空白: /opt/path^ toProgram^ directory/program
  2. \\/opt/path\\ toProgram\\ directory/program
  3. ""引用整个string: "/opt/path toProgram directory/program"
  4. 引用整个string并转义空格: "/opt/path\\ toProgram\\ directory/program"
  5. ''引用整个string: '/opt/path toProgram directory/program'
  6. 将命令行留空/ "" ,并将上述任意一点与其参数组合到一个string中(在为该exec节点设置参数的函数节点中),并将其作为msg.payload – >input参数传入exec节点configuration面板。 没有成功。

什么不是问题:

  • 程序本身运行良好,在我的和客户系统上,它只是不同的path

  • 除了具有空白的具体命令string之外,exec节点及其msg.payload(=input参数或参数)的configuration以及“使用spawn()而不是exec()?” 是好的,工作

请求

有没有其他的方法来逃避我不知道的空白,所以可以find程序的path? 根据我的理解,空格被解释为input参数的分隔符,而不是命令string。 这应该是一个快速修复在我看来,但似乎没有工作,通常在节点,js,php或bash中工作..预先感谢任何提示和想法!

环境:

Node-RED版本:v0.15.2 | Node.js版本:v5.12.0 | Mac OS X 10.11.6 = Darwin 15.6.0 x64 LE

截图

这是stream程的一部分: 流程摘录

这个configuration工程: 命令没有空格

这个configuration不起作用: 命令与空白

我刚刚testing过这个和选项3(用“”引用path)工作正常。

在exec节点的命令部分放置"/home/foo/foo bar/date"正确执行二进制文件

经过一个良好的睡眠之后,解决scheme(至less是我当时的想法)是调整node-red本身的exec节点:原始代码将附加参数(以空格分隔的参数)附加到命令,然后slice整个string由空白转换为数组(node.cmd是命令的path,有或没有空格):

之前: var arg = node.cmd; arg += " "+msg.payload; arg = arg.match(/(?:[^\s"]+|"[^"]*")+/g); var arg = node.cmd; arg += " "+msg.payload; arg = arg.match(/(?:[^\s"]+|"[^"]*")+/g);

(早期的,不完整的)解决scheme是在slice操作之后用内置的array.unshift(<value>)函数向数组添加命令,以便具有空白的命令path不受数组创build的影响:

之后: var arg = ""; …将msg.payload和slice argstring添加到数组中.. arg.unshift(node.cmd);

该文件可以在github上的nodered节点75-exec.jsfind,在46-51行

更新到真正的解决scheme

经过进一步调查显然, Use spawn() instead of exec()? 选项是问题:在双引号和使用exec()的空白命令部分工作正常。 当命令path包含参数时,例如在/home/foo bar/date -r 1000 ,我的方法不能使用。

在redis的官方github版本库的问题之后,命令部分在slice之后的参数数组中,而是在引号中使用空白的命令path,然后解开它们,使用exec()时复制行为。 if (/^".*"$/.test(cmd)) { cmd = cmd.slice(1,-1); } if (/^".*"$/.test(cmd)) { cmd = cmd.slice(1,-1); }现在spawn()和exec()的工作是相同的 – 信用给他,不幸的是我不知道他的用户名在这里。