我目前正在 grep 系统并将结果返回到 ruby 中进行操作。
def grep_system(search_str, dir, filename)
cmd_str ="grep -R '#{search_str}' #{dir} > #{filename}"
system(cmd_str)
lines_array = File.open(filename, "r").read.split("\n)
end
Run Code Online (Sandbox Code Playgroud)
如您所见,我只是将 grep 的结果写入临时文件,然后使用“File.open”重新打开该文件。
有一个更好的方法吗?
永远不要做这样的事情:
cmd_str ="grep -R '#{search_str}' #{dir}"
Run Code Online (Sandbox Code Playgroud)
想都别想。迟早search_str会dir包含 shell 会以意想不到的方式解释的内容。根本不需要调用 shell,您可以Open3.capture3这样使用:
lines = Open3.capture3('grep', '-R', search_str, dir).first
lines, _ = Open3.capture3('grep', '-R', search_str, dir)
Run Code Online (Sandbox Code Playgroud)
这将为您留下一个换行分隔列表lines,从那里应该很容易。
这将grep直接调用,根本不使用 shell。capture3还可以很好地让您忽略(或捕获)命令,stderr而不是stderr默认将其打印到您所在的任何地方。
如果您使用这种形式的capture3,则不必担心 shell 元字符或引用或不卫生的输入。
类似地system,如果您想与参数一起使用,system则可以使用多参数版本:
system('ls', some_var)
Run Code Online (Sandbox Code Playgroud)
而不是潜在的危险:
system("ls #{some_var}")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |