2014-02-17 186 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)。 –

相關問題