Chef recipe:无法将反引号的输出捕获到ruby_block中的变量

时间:2013-07-04 04:57:49

标签: ruby output chef backticks

我有一个带有ruby_block的Chef配方包含:

myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt`
puts ":" + myoutput + ":"
Chef::Log.error('Error installing CA Cert') unless myoutput.include? "Certificate was added to keystore"

(所有变量都已正确设置。)以下是相关输出:

Certificate was added to keystore
::
[2013-07-03T21:26:41-07:00] ERROR: Error installing CA Cert

注意::。为什么myoutput设置不正确?当我手动运行该命令时,我得到了预期的输出。反引号中的命令执行它应该执行的操作,所以我知道它正在运行,但由于某种原因,命令的标准输出没有被分配给myoutput,我无法弄清楚原因。有任何想法吗?谢谢 - 戴夫

编辑:原因是因为这个特定'keytool'调用的输出是stderr,而不是stdout。

2 个答案:

答案 0 :(得分:6)

可能是输出被定向到STDERR而不是STDOUT。试试这个:

myoutput = `keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt 2>&1`

我没有要导入的任何证书来测试它,但单独运行`keytool`会将输出发送到STDERR,而`keytool 2>&1`正常工作。所以我猜这个应用程序正常写入STDERR(很奇怪)。

答案 1 :(得分:3)

2016年更新

你可以做到

require 'mixlib/shellout'
cmd = Mixlib::ShellOut.new("keytool -import -alias #{al} -keystore #{ks} -storepass #{pw} -file #{ca} -trustcacerts -noprompt")
cmd.run_command
# you can now use cmd.stdout and cmd.stderr

厨师文档现在表明你不应该使用反引号,而是mixlib-shellout库:

  

始终使用mixlib-shellout来shell。永远不要使用反引号,Process.spawn,popen4或其他任何东西!

     

mixlib-shellout模块提供了一个简化的接口,可以同时收集标准输出和标准错误,并提供对环境,工作目录,uid,gid等的完全控制。

有关详细信息,请参阅this part of the doc