如何抑制 Rails 控制台/irb 输出
我正在 Rails Console 的生产服务器中测试一些数据库条目,其中几乎所有命令都会生成大量输出行并导致 ssh 通道挂起。
有没有办法抑制控制台/irb screenfuls?
I was testing some DB entries in our production server in Rails Console where almost all the commands were producing a huge number of lines of output and causing the ssh channel to hang.
Is there a way to suppress the console/irb screenfuls?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
在寻找如何使 irb/console 输出静音的解决方案时,我还在 austinruby.com:
沉默 irb:
默认输出:
限制为例如 512 个字符:
In search of a solution how to silence the irb/console output, I also found an answer at austinruby.com:
silence irb:
default output:
limit to eg 512 chars:
在 irb 中运行以下命令对我有用:
running the following within irb works for me:
--simple-prompt
- 使用简单的提示 - 只是>>
--noecho
- 抑制操作结果--simple-prompt
- Uses a simple prompt - just>>
--noecho
- Suppresses the result of operations在这里,将其添加到您的 ~/.irbrc:(
注意:您必须首先安装
ctx
gem,当然,awesome_print
是可选的。)现在,当您打开时任何使用 irb 的控制台,您都可以执行以下操作:
正常模式:
...是的,正是您所期望的。
awesome_print
模式:...哇,现在一切都打印得很棒! :)
安静模式:
...哇,根本没有输出?好的。
不管怎样,你可以添加任何你喜欢的模式,当你完成该模式后,只需
退出
或它,你就会回到之前的模式。希望这有帮助! :)
Here, add this to your ~/.irbrc:
(Note: You must install the
ctx
gem first, thoughawesome_print
is optional, of course.)Now when you are on any console that uses irb, you can do the following:
Normal mode:
...yep, just what you expect.
awesome_print
mode:...wow, now everything is printing out awesomely! :)
Quiet mode:
... whoah, no output at all? Nice.
Anyways, you can add whatever mode you like, and when you're finished with that mode, just
exit
out or it, and you'll be back in the previous mode.Hope that was helpful! :)
一般情况下抑制输出
此外,根据您的需要,请查看使用
quietly
或silence_stream
来一般情况下抑制输出,而不仅仅是在irb/控制台中:注意:
silence_stream
在 Rails 5+ 中被删除。注意:
quietly
将在 Ruby 2.2.0 中被弃用,并最终被删除。 (感谢BenMorganIO!)可以找到更多信息此处。
针对 Rails 5+ 进行解决。
如上所述,
silence_stream
不再可用,因为它不是线程安全的。没有线程安全的替代方案。但是,如果您仍然想使用silence_stream
并且知道它不是线程安全的并且不以多线程方式使用它,您可以手动将其添加回作为初始值设定项。config/initializer/silence_stream.rb
Supress Output, In General
Also, depending on your needs, have a look at using
quietly
orsilence_stream
for suppressing output in general, not just in the irb/console:NOTE:
silence_stream
removed in Rails 5+.NOTE:
quietly
will be deprecated in Ruby 2.2.0 and will eventually be removed. (Thanks BenMorganIO!)More information can be found here.
Work Around for Rails 5+.
As mentioned above,
silence_stream
is no longer available because it is not thread safe. There is no thread safe alternative. But if you still want to usesilence_stream
and are aware that it is not thread safe and are not using it in a multithreaded manner, you can manually add it back as an initializer.config/initializer/silence_stream.rb
添加
nil
作为假返回值以静默输出效果很好,但我更喜欢有一些表明发生了什么。简单的计数通常就足够了。很多时候,通过添加一个count
函数就可以轻松完成这一任务。因此,当我对一堆 Discourse 主题执行某些操作时,我不需要每个主题对象的打印输出。所以我在循环末尾添加.count
:如果我只是分配一些东西,也会发生同样的事情:
完全沉默输出(或使其成为静态的东西,如
nil
)剥夺了我的权利有用的反馈。Adding
nil
as a fake return value to silence output works fine, but I prefer to have some indication of what happened. A simple count is often enough. A lot of times, that's easily done by tacking on acount
function. So when I'm doing something to a bunch of Discourse topics, I don't want a printout of each of the topic objects. So I add.count
at the end of the loop:Same thing if I'm just assigning something:
Silencing output altogether (or making it something static like
nil
) deprives me of useful feedback.尾随
;
应该会抑制输出,正如许多人所期望的那样,这要归功于 Don从 2023 年起,当表达式以分号结尾时,不会回显表达式的结果 PR。现在隐藏不相关的部分要容易得多。
(请注意,在旧版本上,irb 行为可能会有所不同 - 忽略尾随分号,或期望以下语句:)
Trailing
;
should suppress the output, as expected by many, thanks to Don't echo an expression's result when it ends with a semicolon PR from 2023.Hiding irrelevant parts is much easier now.
(Note that on older versions, irb behavior can vary - ignore trailing semicolon, or expect following statement:)
您可以附加
; nil
到你的语句中。示例:
irb
打印最后执行的语句的返回值;因此在这种情况下,它只会打印nil
因为nil
是最后执行的有效语句。You can append
; nil
to your statements.Example:
irb
prints the return value of the last executed statement; thus in this case it'll print onlynil
sincenil
is the last executed valid statement.