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

how to escape whitespace in Node-RED exec node command

情况:

在我的 Node-RED 流程中,调用了另一个程序,我在其中使用了 exec 节点。 参数在函数节点中设置,并作为 msg.payload 传递给 exec 节点。 只要命令中没有 space,这就可以正常工作 returns 预期结果。

问题:

客户不能在他的系统上调用命令,因为程序安装路径tp包含一个白色space.

我试过但没用的:

  1. 用 ^ 转义白色 space 另一个问题:/opt/path^ toProgram^ directory/program
  2. 逃避白色space 与 \: /opt/path\ toProgram\ directory/program
  3. "" 引用整个字符串:"/opt/path toProgram directory/program"
  4. 引用整个字符串并转义白色space:"/opt/path\ toProgram\ directory/program"
  5. '' 引用整个字符串:'/opt/path toProgram directory/program'
  6. 将命令行留空/""并将上述任何一点与其参数组合成一个字符串(在为该 exec 节点设置参数的函数节点中)并将其作为msg.payload -> 在执行节点配置面板中输入参数。没有成功。

不是什么问题:

请求

有没有其他方法可以逃脱我不知道的whitespace,从而找到程序的路径?根据我的理解, whitespace 被解释为输入参数的分隔符,它应该是,但不是在命令字符串上。 在我看来,这应该是一个快速修复,但是通常在节点、js、php 或 bash 中似乎没有任何效果。提前感谢您的任何提示和想法!

环境:

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

截图

这是流程的一部分:

此配置有效:

此配置不起作用:

睡个好觉后,解决方案(至少我当时是这么想的)是在 node-red 本身中调整 exec 节点:原始代码将附加参数(由空格分隔的参数)附加到命令,然后将整个字符串按空格切片成一个数组(node.cmd 是带或不带空格的命令的路径):

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

并且(早期的,不完整的)解决方案是在切片操作之后将带有内置 array.unshift(<value>) 函数的命令添加到数组中,这样带有空格的命令路径就不会受到数组创建的影响:

之后:var arg = ""; ...添加 msg.payload 并将 arg 字符串切片到数组中.. arg.unshift(node.cmd);

文件位于:nodered node 75-exec.js on github,第 46-51 行

实际解决方案更新:

经过进一步调查,很明显 Use spawn() instead of exec()? 选项是问题所在:在双引号中使用空格并使用 exec() 的命令部分工作正常。当命令路径包含参数时,我的方法无法使用,例如在 /home/foo bar/date -r 1000.

the official github repository of node-red 的问题之后,命令部分在切片之后的开头指向参数数组,而是让命令路径在引号中包含空格,然后展开它们,复制 exec() 时的行为用来。他在原始文件中的第 51 行之后添加了这一行:if (/^".*"$/.test(cmd)) { cmd = cmd.slice(1,-1); } 现在 spawn() 和 exec() 的工作方式相同 - 感谢他,不幸的是我在这里不知道他的用户名。

我刚刚对此进行了测试,选项 3(用“”引用路径)工作正常。

"/home/foo/foo bar/date" 放入 exec 节点的 command 部分正确执行了二进制文件