[ruby-on-rails] Rails 콘솔 / irb 출력을 억제하는 방법

나는 꽤 이상한 문제에 봉착했다.

저는 Rails Console의 프로덕션 서버에서 일부 db 항목을 테스트하고 있었는데, 거의 모든 명령이 ssh 채널이 중단되는 결과로 인해 엄청난 수의 o / p 라인을 생성했습니다.

콘솔 / irb 스크린 풀을 억제하는 방법이 있습니까?

감사



답변

추가 할 수 있습니다 . 모든 명령 / 문에 nil .

예:

users = User.all; nil

실제로 irb는 마지막으로 실행 된 명령문의 (반환) 값을 인쇄합니다. 따라서이 경우 nil이 마지막으로 실행 된 유효한 문이므로 nil 만 인쇄됩니다. 🙂


답변

irb / console 출력을 침묵시키는 방법을 찾기 위해 austinruby.com 에서도 답변을 찾았습니다 .

침묵 irb :

conf.return_format = ""

기본 출력 :

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

예를 들어 512 자로 제한 :

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


답변

여기에 이것을 ~ / .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이지만 먼저 gem을 설치해야합니다 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또는 종료 하면 이전 모드로 돌아갑니다.

도움이 되었기를 바랍니다. 🙂


답변

irb 내에서 다음을 실행하면 저에게 효과적입니다.

irb_context.echo = false


답변

irb --simple-prompt --noecho
  • --simple-prompt -간단한 프롬프트 사용-그냥 >>
  • --noecho -작업 결과를 억제합니다.


답변

일반적으로 출력 억제

또한 필요 에 따라 irb / console뿐만 아니라 일반적으로 출력 을 사용 quietly하거나 silence_stream억제 하는 방법을 살펴보십시오 .

silence_stream(STDOUT) do
  users = User.all
end

참고 : silence_streamRails 5+에서 제거되었습니다.

참고 : quietlyRuby 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


답변