Рецепт шеф-повара: не удается захватить выходные данные из backticks в переменную в ruby block
У меня есть рецепт шеф-повара с ruby_block, содержащим это:
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 не установлен правильно? Когда я выполняю эту команду вручную,я получаю ожидаемый результат. Команда в backticks делает то, что должна, поэтому я знаю, что она работает, но по какой-то причине стандартный вывод команды не назначается на myoutput, и я не могу понять, почему. Какой-нибудь идеи? Спасибо-Dave
Edit: причина в том, что вывод этого конкретного вызова 'keytool' будет stderr, а не stdout.
2 ответа:
Возможно, что вывод направлен на 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
Документация chef теперь указывает, что Вы должны использовать не backticks , а библиотеку
mixlib-shellout
:Всегда используйте mixlib-shellout, чтобы раскошелиться. Никогда не используйте задние палочки, процесс.Спаун, popen4 или что-нибудь еще!
Модуль mixlib-shellout предоставляет упрощенный интерфейс для Шеллинга, сохраняя при этом как стандартный выход, так и стандартную ошибку и обеспечивая полный контроль над окружающей средой, работая каталог, uid, gid и т. д.
Смотрите эту часть документа для получения более подробной информации.