Рецепт шеф-повара: не удается зафиксировать вывод обратных кавычек в переменную в ruby_block

У меня есть рецепт Chef с 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

Обратите внимание на ::. Почему мой вывод не установлен правильно? Когда я запускаю эту команду вручную, я получаю ожидаемый результат. Команда в обратных кавычках делает то, что должна, поэтому я знаю, что она работает, но по какой-то причине стандартный вывод команды не назначается моему выходу, и я не могу понять, почему. Любые идеи? Спасибо -- Дэйв

Изменить: причина в том, что вывод этого конкретного вызова «keytool» будет stderr, а не stdout.


person f8ster    schedule 04.07.2013    source источник
comment
используйте двойные кавычки, чтобы ваша переменная интерпретировалась молодым падаваном.   -  person oldergod    schedule 04.07.2013


Ответы (2)


Возможно, вывод направляется в STDERR вместо STDOUT. Попробуй это:

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

У меня нет сертификата для импорта, чтобы проверить это, но запуск только `keytool` отправляет вывод в STDERR, тогда как `keytool 2>&1` работает нормально. Итак, я предполагаю, что это приложение нормально пишет в STDERR (очень странно).

person Hari Gopal    schedule 04.07.2013
comment
Именно в этом причина! Это необычное поведение, но я подтвердил это здесь. Большое спасибо! - person f8ster; 04.07.2013

Обновление 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, чтобы раскошелиться. Никогда не используйте обратные кавычки, Process.spawn, popen4 или что-то еще!

Модуль mixlib-shellout предоставляет упрощенный интерфейс для шеллинга, в то же время собирая как стандартный вывод, так и стандартные ошибки, и обеспечивая полный контроль над средой, рабочим каталогом, uid, gid и т. д.

Дополнительные сведения см. в этой части документа.

person deterralba    schedule 27.06.2016