rails - 将控制台输出重定向到文件

kik*_*ito 77 ruby console ruby-on-rails file

在bash控制台上,如果我这样做:

cd mydir
ls -l > mydir.txt
Run Code Online (Sandbox Code Playgroud)

>运算符捕获标准输入并将其重定向到文件; 所以我得到的文件列表mydir.txt而不是标准输出.

有没有办法在rails控制台上做类似的事情?

我有一个ruby语句,可以生成大量的打印件(~8k行),我希望能够完全看到它,但是控制台只能"记住"最后的1024行左右.所以我想重定向到一个文件 - 如果有人知道一个更好的选择,我都是耳朵.

Min*_*mul 131

如果您正在寻找快速的一次性解决方案,只需使用以下内容:

irb(main):001:0> f = File.new("statements.xml", 'w')
irb(main):002:0> f << Account.find(1).statements.to_xml
irb(main):003:0> f.close
Run Code Online (Sandbox Code Playgroud)

创建一个JSON fixture

>> f = File.new(Rails.root + 'spec/fixtures/qbo/amy_cust.json', 'w')
>> f << JSON.pretty_generate((q.get :customer, 1).as_json)
>> f.close
Run Code Online (Sandbox Code Playgroud)

  • 文件`statements.xml`在哪里保存在系统中.我找不到文件. (5认同)
  • 这是展示如何保存特定记录转储的更好答案,而不是告诉某人添加另一个 gem 或插件(厌倦了不需要时的软件推荐)或将控制台中的所有内容转储到文件。投票了。 (2认同)

Veg*_*ger 94

您可以使用override $stdout来重定向控制台输出:

$stdout = File.new('console.out', 'w')
Run Code Online (Sandbox Code Playgroud)

您可能还需要调用一次:

$stdout.sync = true
Run Code Online (Sandbox Code Playgroud)

这会将所有输出重定向到文件.如果要暂时重定向输出,请确保存储原始值,$stdout以便可以将其更改回来.

  • 在我添加`$ stdout.sync = true`之前,它对我不起作用.编辑. (2认同)
  • `$ stdout.reopen("my.log","w")`似乎是一个更优雅的解决方案,见:http://stackoverflow.com/a/2480439/21217 (2认同)

小智 10

除了Veger的答案之外,还有一种方法可以做到这一点,它还提供了许多其他选项.

只需打开rails项目目录并输入命令:

rails c | tee output.txt
Run Code Online (Sandbox Code Playgroud)

tee命令还有许多其他选项,您可以通过以下方式查看:

man tee
Run Code Online (Sandbox Code Playgroud)