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 –