value = %x(#{"svn lock #{@path}/#{@file}"})
svn: warning: W160035: Path '/README.txt' is already locked by user 'tester' in filesystem 'some_path'
""
返回空字符串,而随后的svn:警告信息。我想记录svn警告消息。我究竟做错了什么。
感谢您的帮助提前。
value = %x(#{"svn lock #{@path}/#{@file}"})
svn: warning: W160035: Path '/README.txt' is already locked by user 'tester' in filesystem 'some_path'
""
返回空字符串,而随后的svn:警告信息。我想记录svn警告消息。我究竟做错了什么。
感谢您的帮助提前。
这可能是因为所述输出被发送到STDERR,不STDOUT(这是所有%x
捕获)。由于您没有捕获它,它会执行通常会打印到控制台的内容。
您可以重定向STDERR到STDOUT在您的命令:
%x(svn lock #{@path}/#{@file} 2>&1)
或者使用Open3捕捉到标准输出& 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
第一个选项卸载工作,以执行壳命令,并根据环境可能不支持它。因此使用Open3是一种更加便携的解决方案。
一些额外的注意事项:注意我已经删除了%x
声明中不必要的插值。另外,请考虑使用ShellWords正确地在shell命令中转义插入的字符串。如果这些是用户输入的字符串,这一点尤其重要。
这很有趣 - '%x(svn lock#{@ path} /#{@ file} 2>&1)'。 '2>&1'是什么意思? –
太酷了。获得的教训 – Ross
@ArupRakshit它将STDERR(它是文件描述符#2)重定向到STDOUT(它是文件描述符#1)。 –
您的问题是反引号(或%x
)返回STDOUT的输出,而在这种情况下,您需要STDERR。使用例如Open3::capture2e
代替:
http://www.ruby-doc.org/stdlib-2.0.0/libdoc/open3/rdoc/Open3.html#method-c-capture2e
请参阅http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby/20001569#20001569 - 您需要使用http://www.ruby-doc.org/ stdlib-2.0.0/libdoc/open3/rdoc/Open3.html#method-c-capture2e –