Jak zablokować wyjścia konsoli / irb Railsów

89

Utknąłem z dość dziwnym problemem.

Testowałem niektóre wpisy db na naszym serwerze produkcyjnym w Rails Console, gdzie prawie wszystkie polecenia dawały ogromną liczbę linii o / p, przez co zawieszał się kanał ssh :(

Czy istnieje sposób na powstrzymanie wyświetlania screenfulów konsoli / irb?

Dzięki

ghtn
źródło

Odpowiedzi:

190

Możesz dołączyć ; zero dla wszystkich twoich poleceń / instrukcji.

Przykład:

users = User.all; nil

Właściwie irb wypisuje (zwracaną) wartość ostatniej wykonanej instrukcji. Zatem w tym przypadku wypisze tylko nil, ponieważ nil jest ostatnią wykonaną prawidłową instrukcją :)

intellidiot
źródło
13
Niesamowite, jeszcze krótsza droga to średnik, po którym następuje obiekt taki jakusers = User.all; 0
Bob.
1
Działa to tylko dla zwracanych obiektów, a nie działa z p i puts.
the_minted,
to tylko hack, możesz po prostu użyć count, na przykład Users.all.count, tylko jednego wyjścia liniowego, a jeśli chcesz przechowywać dane wyjściowe w zmiennej, możesz to zrobić w ten sposóbusers = User.all; Users.all.count
Tasawar Hussain
31

Szukając rozwiązania, jak wyciszyć wyjście irb / console, znalazłem również odpowiedź na austinruby.com :

cisza irb:

conf.return_format = ""

domyślne wyjście:

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

ograniczenie do np. 512 znaków:

conf.return_format = "=> limited output\n %.512s\n"
LarsDK
źródło
Bardzo przydatne. Czy jest szansa, aby to ustawić podczas otwierania konsoli irb / rails, czyli alias parametru w?
Kache
Możesz spróbować umieścić to w $ HOME / .irbrc
hdgarrood
8

Tutaj dodaj to do swojego ~ / .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

(Uwaga: najpierw musisz zainstalować ctxklejnot, chociaż awesome_printjest to oczywiście opcjonalne).

Teraz, gdy jesteś na dowolnej konsoli korzystającej z irb, możesz wykonać następujące czynności:

Tryb normalny:

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"}}}

... tak, właśnie tego oczekujesz.

awesome_print tryb:

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"
        }
    }
}

... wow, teraz wszystko świetnie się drukuje! :)

Tryb cichy:

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>

... no, w ogóle nie ma wyjścia? Ładny.

W każdym razie możesz dodać dowolny tryb, który lubisz, a kiedy skończysz z tym trybem, po prostu exitwyjdź lub wróć, a wrócisz do poprzedniego trybu.

Mam nadzieję, że to było pomocne! :)

Chmura Masona
źródło
4

uruchomienie następujących w irb działa dla mnie:

irb_context.echo = false
schpet
źródło
4
irb --simple-prompt --noecho
  • --simple-prompt - Używa prostego monitu - po prostu >>
  • --noecho - pomija wynik operacji
user3490179
źródło
4

Ogólnie tłumi wyjście

Ponadto, w zależności od potrzeb, spójrz na ogólne użycie quietlylub silence_streamtłumienie wyjścia, a nie tylko w irb / console:

silence_stream(STDOUT) do
  users = User.all
end

UWAGA: silence_streamusunięto w Rails 5+.

UWAGA: quietlybędzie przestarzały w Rubim 2.2.0 i ostatecznie zostanie usunięty. (Dzięki BenMorganIO !)

Więcej informacji można znaleźć tutaj .

Obejście dla Rails 5+.

Jak wspomniano powyżej, silence_streamnie jest już dostępny, ponieważ nie jest bezpieczny dla wątków. Nie ma alternatywy bezpiecznej dla wątków. Ale jeśli nadal chcesz używać silence_streami zdajesz sobie sprawę, że nie jest bezpieczny dla wątków i nie używasz go w sposób wielowątkowy, możesz ręcznie dodać go z powrotem jako inicjator.

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
Joshua Pinter
źródło
1
Zauważ, że quietlyjest przestarzałe w Ruby 2.2.0 i zostanie usunięte.
BenMorganIO
@BenMorganIO Dodano notatkę do odpowiedzi. Dziękuję za to!
Joshua Pinter,