value = %x( #{"svn lock #{@path}/#{@file}"} )
=>
svn: warning: W160035: Path '/README.txt' is already locked by user 'tester' in filesystem 'some_path'
""
返回空字符串,而不是svn:warning消息。我想记录svn警告消息。我究竟做错了什么。
提前感谢您的帮助。
答案 0 :(得分:5)
这很可能是因为输出被发送到STDERR,而不是STDOUT(这是%x
个捕获)。因为你没有捕获它,它会按照正常情况进行操作并打印到控制台。
您可以在命令中将STDERR重定向到STDOUT:
%x(svn lock #{@path}/#{@file} 2>&1)
或使用Open3捕获STDOUT和& STDERR:
require 'open3'
Open3.popen3("svn lock #{@path}/#{@file}") do |stdin, stdout, stderr, wait_thr|
puts "stdout is:" + stdout.read
puts "stderr is:" + stderr.read
end
第一个选项将工作卸载到执行命令的shell,并且根据环境可能不支持它。因此,使用Open3是一种更便携的解决方案。
一些附加说明:请注意我已在%x
语句中删除了不必要的插值。另外,考虑使用ShellWords在shell命令中正确转义插值字符串。如果这些是用户输入的字符串,这一点尤其重要。
答案 1 :(得分:2)
你的问题是反引号(或%x
)返回STDOUT的输出,而在这种情况下你需要STDERR。使用例如Open3::capture2e
代替:
http://www.ruby-doc.org/stdlib-2.0.0/libdoc/open3/rdoc/Open3.html#method-c-capture2e