使用适当的参数转义从Ruby在后台执行shell命令

11

我必须在后台运行一个命令,但我希望对它的参数进行适当的转义。

system("rake send_mails subject='#{params[:subject]}' 2> /dev/null 1> /dev/null &");
如果我写 system("rake", "send_mails", params[:subject]),那么我就没有“位置”来进行重定向和使用 & 符号。如果我不这样做,我就没有对 subject 参数进行转义。
如何解决这个问题?

我不确定,但你是否尝试嵌套 system 调用?例如:system(system("rake", "send_mails", params[:subject]), "/dev/null 1> /dev/null &") - fl00r
内部的 system() 调用被执行,然后外部的 system() 在执行任何内容之前就失败了:TypeError: 无法将 true 转换为字符串 - Notinlist
1个回答

20

在 Ruby 1.9 中,可以尝试使用 Process.spawn

# Spawn a new process and run the rake command
pid = Process.spawn({"subject" => params[:subject]},
                    "rake", "send_mails",
                    :out => 'dev/null', :err => 'dev/null')

# Detach the spawned process
Process.detach pid

1
然后在你生成新进程之后使用Process.detach。我会编辑我的答案以包含这个。 - Lars Haugseth
1
在 1.8.7 中,可以使用 Process.fork do ... end,它非常接近完美。 - Notinlist
1
但我仍然渴望一个类似于 PHP 的 escapeshellarg() 函数。 - Notinlist
我知道已经有一段时间了,但是有Shellwords库:https://dev59.com/l2025IYBdhLWcg3wi2iw. - radiospiel
@radiospiel,您的链接指向此页面。可能是复制粘贴错误? - Notinlist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接