Рецепт шеф-повара: не удается захватить выходные данные из 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 3

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 и т. д.

Смотрите эту часть документа для получения более подробной информации.