2014-02-17 104 views
2
value = %x(#{"svn lock #{@path}/#{@file}"}) 

=>%×返回空字符串,而不是实际的结果

svn: warning: W160035: Path '/README.txt' is already locked by user 'tester' in filesystem 'some_path' 
"" 

返回空字符串,而随后的svn:警告信息。我想记录svn警告消息。我究竟做错了什么。

感谢您的帮助提前。

+1

请参阅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 –

回答

5

这可能是因为所述输出被发送到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命令中转义插入的字符串。如果这些是用户输入的字符串,这一点尤其重要。

+0

这很有趣 - '%x(svn lock#{@ path} /#{@ file} 2>&1)'。 '2>&1'是什么意思? –

+0

太酷了。获得的教训 – Ross

+1

@ArupRakshit它将STDERR(它是文件描述符#2)重定向到STDOUT(它是文件描述符#1)。 –

相关问题