我想从ruby脚本中调用命令行实用程序,如下所示:
std::string
结果调用应如下所示:
#!/env/ruby
json = {"key" => "value that \"has\" quotes"}.to_json
`aws events put-targets --cli-input-json #{json}`
但是,此字符串插值中的结果导致外观清晰的json结构而没有引号引起来,因此在命令行中导致错误。例如。
aws events put-targets --cli-input-json "{\"key\": \"value that \"has\" quotes\"}"
我需要正确转义所有引号,以便可以将命令行的字符串解析为正确的json。
我尝试执行字符串操作以手动转义引号,例如:
aws events put-targets --cli-input-json {"key": "value that \"has\" quotes"}
但这也不起作用。
这似乎比应该做的难。如何将正确转义的json字符串呈现给命令行调用?
我确实有一个Rails环境,如果ActiveSupport提供的实用程序可以简化此过程,则可以通过它运行该环境。
答案 0 :(得分:2)
在这种情况下,在没有shell的情况下进行 的系统调用更加简单有效。如果您使用Kernel#system
的多参数形式直接调用外部命令:
system('aws', 'events', 'puts-targets', '--cli-input-json', json)
没有外壳,json
没有引用或转义问题。
如果您需要做更复杂的事情(例如捕获输出或错误),请查看Open3
中的各种方法。
如果您绝对必须通过外壳,那么总会有Shellwords.shellescape
。但是实际上,当您使用外壳时,您将:
为什么不直接找(4)?
答案 1 :(得分:0)
由于@ mu-is-too-short,我遇到了Shellwords,它是一个简洁的实用程序。但是,这并不能解决问题,而是导致我搜索“ shellscape json”,这反过来又导致我:Best way to escape and unescape strings in Ruby?
所以:
json = {"key" => "value that \"has\" quotes"}.to_json.dump
正确获取bash可以理解的转义字符串。多田。
更新:请勿在生产代码中使用它。最好遵循注释中@ mu-is-too-short的建议或使用更高级别的库。