Почему не отображается стандартный вывод задачи rake, вызванной обратными кавычками?

Когда задача rake вызывается через рюкзаки, ее вывод подавляется:

task :two do
    puts 'two'
end

task :one do
    puts 'one'
    `rake two`
end 

-bash> bundle exec rake one
one

Принимая во внимание, что вывод отображается при вызове через .invoke:

task :one do
    puts 'one'
    Rake::Task['two'].invoke
end 

-bash> bundle exec rake one
one
two

Почему вывод подавляется обратными кавычками и как его можно отобразить?

Вышеприведенный пример является надуманным, но в конечном итоге я хочу иметь возможность запускать локальную задачу rake, которая сама запускает удаленную задачу rake, на Heroku, и я хочу видеть ее результат в реальном времени (потому что удаленная задача является интерактивной, т. е. задает вопросы через puts и ожидает пользовательского/стандартного ввода через $stdin.gets.chomp):

task :one do
    puts 'one'
    `heroku run rake my_app:reset_user_passwords --app #{MY_APP_NAME}`
end

person user664833    schedule 04.01.2019    source источник
comment
Для интерактивных задач вам, вероятно, потребуется провести рефакторинг с помощью pty и ожидать модули или просто раскошелиться на Expect напрямую.   -  person Todd A. Jacobs    schedule 05.01.2019


Ответы (1)


Обратные кавычки возвращают стандартный вывод команды, поэтому, если вы хотите увидеть результат, просто позвоните puts:

task :one do
    puts 'one'
    puts `heroku run rake my_app:reset_user_passwords --app #{MY_APP_NAME}`
end

Если вам нужно интерактивное выполнение, вы можете попробовать использовать IO#expect

person mrzasa    schedule 04.01.2019
comment
Большое спасибо за ответ. К сожалению, я не упомянул, что удаленная задача является интерактивной, поэтому мне нужно видеть вывод в реальном времени, а не после завершения задачи. Я обновил свой вопрос, чтобы отразить это. - person user664833; 05.01.2019