如何在Node-RED exec node命令中转义空格
情况:
在我的Node-REDstream程中,有一个调用另一个程序的地方,我使用了exec节点。 参数在函数节点中设置,并作为msg.payload传递给exec节点。 这工作正常,并返回预期的结果,只要命令没有空间。
问题:
客户不能使用对他的系统上的命令的调用,因为程序的安装path包含一个空格。
我尝试过但没有工作:
- 在另一个问题中读取与^的空白:
/opt/path^ toProgram^ directory/program
- 用
\\
:/opt/path\\ toProgram\\ directory/program
- 用
""
引用整个string:"/opt/path toProgram directory/program"
- 引用整个string并转义空格:
"/opt/path\\ toProgram\\ directory/program"
- 用
''
引用整个string:'/opt/path toProgram directory/program'
- 将命令行留空/
""
,并将上述任意一点与其参数组合到一个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()的工作是相同的 – 信用给他,不幸的是我不知道他的用户名在这里。