bash脚本的%x返回空字符串而不是实际结果

时间:2014-02-17 14:39:51

标签: ruby

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警告消息。我究竟做错了什么。

提前感谢您的帮助。

2 个答案:

答案 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