Як придушити виходи консолі / IRB Rails


89

У мене застрягла досить дивна проблема.

Я тестував деякі записи db на нашому виробничому сервері в Rails Console, де майже всі команди приводили до величезної кількості рядків o / p, через що канал ssh був повішений :(

Чи є спосіб придушити екранні зображення консолі / irb?

Дякую

Відповіді:


190

Ви можете додати ; нуль для всіх ваших команд / заяв.

Приклад:

users = User.all; nil

Фактично irb друкує (повернене) значення останнього виконаного оператора. Таким чином, у цьому випадку він буде друкувати лише nil, оскільки nil є останнім виконаним дійсним оператором :)


13
Дивовижно, ще коротший шлях - крапка з комою, за якою слідує такий об’єкт, якusers = User.all; 0
Боб,

1
Це працює лише для повернутих об'єктів, а не робота p і put.
the_minted

це просто хак, ви можете просто використовувати count, наприклад Users.all.count, лише один рядок, і якщо ви хочете зберегти вихід у змінній, це можна зробити такusers = User.all; Users.all.count
Tasawar Hussain

31

У пошуках рішення, як приглушити вихід irb / console, я також знайшов відповідь на austinruby.com :

тиша irb:

conf.return_format = ""

вихід за замовчуванням:

conf.return_format = "=> %s\n"

наприклад, 512 символів:

conf.return_format = "=> limited output\n %.512s\n"

Дуже корисний. Будь-який шанс є спосіб встановити це під час відкриття консолі irb / rails, тобто псевдонім параметра в?
Kache

Ви можете спробувати помістити його в $ HOME / .irbrc
hdgarrood

8

Тут додайте це до вашого ~ / .irbrc:

require 'ctx'
require 'awesome_print'

module IRB
  class Irb    
    ctx :ap do
      def output_value()
        ap(@context.last_value)
      end
    end
    ctx :puts do
      def output_value()
        puts(@context.last_value)
      end
    end
    ctx :p do
      def output_value()
        p(@context.last_value)
      end
    end
    ctx :quiet do
      def output_value()
      end
    end
  end
end

def irb_mode(mode)
  ctx(mode) { irb }
end

(Примітка: Ви повинні ctxспочатку встановити самоцвіт, хоча awesome_print, звичайно, необов’язково.)

Тепер, перебуваючи на будь-якій консолі, яка використовує irb, ви можете зробити наступне:

Нормальний режим:

irb(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }

=> {:this=>"is a complex object", :that=>[{:will=>"probably"}, {:be=>"good to read"}], :in=>{:some=>{:formatted=>"way"}}}

... так, саме те, що ви очікуєте.

awesome_print режим:

irb(main):002:0> irb_mode(:ap)
irb#1(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }

=> {
    :this => "is a complex object",
    :that => [
        [0] {
            :will => "probably"
        },
        [1] {
            :be => "good to read"
        }
    ],
      :in => {
        :some => {
            :formatted => "way"
        }
    }
}

... нічого собі, зараз все чудово роздруковується! :)

Тихий режим:

irb#1(main):002:0> irb_mode(:quiet)
irb#1(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }
irb#1(main):002:0>

... ну, взагалі немає виходу? Приємно.

У будь-якому випадку, ви можете додати будь-який режим, який вам подобається, і коли закінчите з цим режимом, просто exit вимкніть його, і ви повернетесь у попередній режим.

Сподіваюся, це було корисно! :)


4

запуск наступного в irb працює для мене:

irb_context.echo = false

4
irb --simple-prompt --noecho
  • --simple-prompt - Використовує просту підказку - просто >>
  • --noecho - Пригнічує результат операцій

4

Придушити вихід, загалом

Крім того, залежно від ваших потреб, погляньте на використання quietlyчи silence_streamпридушення вихідних даних загалом, а не лише на irb / console:

silence_stream(STDOUT) do
  users = User.all
end

ПРИМІТКА: silence_streamвидалено в Rails 5+.

ПРИМІТКА: quietlyбуде припинено в Ruby 2.2.0 і врешті-решт буде видалено. (Дякую BenMorganIO !)

Більше інформації можна знайти тут .

Попрацюйте для Rails 5+.

Як зазначалося вище, silence_streamвін більше не доступний, оскільки не є безпечним для потоків. Не існує безпечної альтернативи. Але якщо ви все-таки хочете використовувати silence_streamі знаєте, що він не є безпечним для потоку і не використовує його багатопотоково, ви можете вручну додати його назад як ініціалізатор.

config/initializer/silence_stream.rb

# Re-implementation of `silence_stream` that was removed in Rails 5 due to it not being threadsafe.
# This is not threadsafe either so only use it in single threaded operations.
# See https://api.rubyonrails.org/v4.2.5/classes/Kernel.html#method-i-silence_stream.
#
def silence_stream( stream )
  old_stream = stream.dup
  stream.reopen( File::NULL )
  stream.sync = true
  yield

ensure
  stream.reopen( old_stream )
  old_stream.close
end

1
Зауважте, що quietlyзастарілий в ruby ​​2.2.0 і буде видалений.
BenMorganIO

@BenMorganIO Додав примітку до відповіді. Дякую за це!
Джошуа Пінтер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.