0

我有一个使用 popen4 的自定义启动器应用程序。该脚本将末尾的双连字符“--”之后的所有内容传递到 popen4,我使用标准输出功能进行一些客户管道和统计数据收集。

当我们启动的脚本采用包含空格的参数时,就会出现问题。

my_launcher.rb --keep-alive --log-file /path/file.log -- /launch/this/script.rb --foo "param with spaces"

shell 去掉了“带空格的参数”周围的引号,因为 popen4 只接受字符串,所以如果不做一些我担心会引入错误的正则表达式工作,就无法重新添加这些引号。

'regular' popen 提供了一种将命令作为数组传递并因此绕过 shell 的方法,但这似乎在 popen4 中没有实现。


来自 ruby​​ IO 的 rdoc

http://www.ruby-doc.org/core-1.9.3/IO.html

如果 cmd 是字符串“-”,则启动一个新的 Ruby 实例作为子进程。

如果 cmd 是一个字符串数组,那么它将被用作绕过 shell 的子进程的 argv。


有没有办法访问popen使用的“绕过外壳”功能并将该对象传递给popen4?

或者,有没有办法获取字符串数组,并在适当的情况下使用包含引号的格式对其进行格式化,以便将包含空格的参数识别为一个参数?然后我可以将此字符串传递给popen4。

谢谢!

4

1 回答 1

0

我通过使用 shellwords 模块解决了这个问题

 require 'shellwords'
 args = [ '/launch/this/script.rb', '--foo', 'param with spaces' ]
 popen4( Shellwords.join( args ) )
于 2013-02-12T20:50:35.590 回答