如何在 Node-RED exec node 命令中转义空格
how to escape whitespace in Node-RED exec node command
情况:
在我的 Node-RED 流程中,调用了另一个程序,我在其中使用了 exec 节点。
参数在函数节点中设置,并作为 msg.payload 传递给 exec 节点。
只要命令中没有 space,这就可以正常工作 returns 预期结果。
问题:
客户不能在他的系统上调用命令,因为程序安装路径tp包含一个白色space.
我试过但没用的:
- 用 ^ 转义白色 space 另一个问题:
/opt/path^ toProgram^ directory/program
- 逃避白色space 与
\
: /opt/path\ toProgram\ directory/program
- 用
""
引用整个字符串:"/opt/path toProgram directory/program"
- 引用整个字符串并转义白色space:
"/opt/path\ toProgram\ directory/program"
- 用
''
引用整个字符串:'/opt/path toProgram directory/program'
- 将命令行留空/
""
并将上述任何一点与其参数组合成一个字符串(在为该 exec 节点设置参数的函数节点中)并将其作为msg.payload -> 在执行节点配置面板中输入参数。没有成功。
不是什么问题:
程序本身运行良好,在我的和客户的系统上,只是路径不同
除了带有白色space的特定命令字符串外,exec节点的配置及其msg.payload(=输入参数或参数)以及"use spawn() instead of exec()?" 可以正常工作
请求
有没有其他方法可以逃脱我不知道的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 部分正确执行了二进制文件
情况:
在我的 Node-RED 流程中,调用了另一个程序,我在其中使用了 exec 节点。 参数在函数节点中设置,并作为 msg.payload 传递给 exec 节点。 只要命令中没有 space,这就可以正常工作 returns 预期结果。
问题:
客户不能在他的系统上调用命令,因为程序安装路径tp包含一个白色space.
我试过但没用的:
- 用 ^ 转义白色 space 另一个问题:
/opt/path^ toProgram^ directory/program
- 逃避白色space 与
\
:/opt/path\ toProgram\ directory/program
- 用
""
引用整个字符串:"/opt/path toProgram directory/program"
- 引用整个字符串并转义白色space:
"/opt/path\ toProgram\ directory/program"
- 用
''
引用整个字符串:'/opt/path toProgram directory/program'
- 将命令行留空/
""
并将上述任何一点与其参数组合成一个字符串(在为该 exec 节点设置参数的函数节点中)并将其作为msg.payload -> 在执行节点配置面板中输入参数。没有成功。
不是什么问题:
程序本身运行良好,在我的和客户的系统上,只是路径不同
除了带有白色space的特定命令字符串外,exec节点的配置及其msg.payload(=输入参数或参数)以及"use spawn() instead of exec()?" 可以正常工作
请求
有没有其他方法可以逃脱我不知道的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 部分正确执行了二进制文件