繁体   English   中英

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

[英]Chef recipe: can't capture output from backticks to variable in ruby_block

我有一个带有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。

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

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

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

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模块提供了一个简化的界面来进行shelling,同时仍然收集标准输出和标准错误,并提供对环境,工作目录,uid,gid等的完全控制。

有关更多详细信息,请参阅文档的这一部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM