2010-03-17 28 views
59

Trên một bash console, nếu tôi làm điều này:ray - Chuyển hướng điều khiển đầu ra vào một tập tin

cd mydir 
ls -l > mydir.txt 

Các> điều hành bắt đầu vào tiêu chuẩn và chuyển hướng nó vào một tập tin; vì vậy tôi nhận được danh sách các tập tin trong mydir.txt thay vì ở đầu ra tiêu chuẩn.

Có cách nào để thực hiện điều gì đó tương tự trên bảng điều khiển đường ray không?

Tôi đã có một tuyên bố ruby ​​tạo nhiều bản in (~ 8k dòng) và tôi muốn có thể xem nó hoàn toàn, nhưng bàn điều khiển chỉ "ghi nhớ" 1024 dòng cuối cùng hoặc lâu hơn. Vì vậy, tôi nghĩ về chuyển hướng đến một tập tin - Nếu có ai biết một lựa chọn tốt hơn, tôi là tất cả các tai.

Trả lời

77

Bạn có thể sử dụng ghi đè $stdout để chuyển hướng giao diện điều khiển đầu ra:

$stdout = File.new('console.out', 'w') 

Bạn cũng có thể cần phải gọi đây là một lần:

$stdout.sync = true 

này sẽ chuyển hướng tất cả đầu ra cho tập tin. Nếu bạn muốn tạm thời chuyển hướng đầu ra, hãy đảm bảo rằng bạn lưu trữ giá trị ban đầu của $stdout để bạn có thể thay đổi lại.

+0

Cảm ơn bạn! Điều này thật đúng với gì mà tôi đã tìm kiếm. – kikito

+2

Nó không hoạt động cho tôi cho đến khi tôi thêm '$ stdout.sync = true'. Đã chỉnh sửa. –

+2

'$ stdout.reopen (" my.log "," w ")' có vẻ là một giải pháp thanh lịch hơn, xem tại: http://stackoverflow.com/a/2480439/21217 – dain

3

Nếu bạn viết mã sau vào tệp môi trường của mình, mã sẽ hoạt động.

if "irb" == $0 
    config.logger = Logger.new(Rails.root.join('path_to_log_file.txt')) 
end 

Bạn cũng có thể xoay các log file sử dụng

config.logger = Logger.new(Rails.root.join('path_to_log_file.txt'), number_of_files, file_roation_size_threshold) 

Đối đăng nhập hoạt động chỉ ghi lại hoạt động liên quan, bạn có thể làm

ActiveRecord::Base.logger = Logger.new(Rails.root.join('path_to_log_file.txt')) 

này cũng cho phép bạn có khác nhau logger config/tập tin cho các môi trường khác nhau.

+0

Điều này là hữu ích, nhưng câu trả lời khác làm những gì tôi muốn một cách đơn giản hơn. Cảm ơn bạn đã dành thời gian trả lời. – kikito

2

Sử dụng hirb. Nó tự động trang bất kỳ đầu ra trong irb đó là dài hơn một screenful. Đặt điều này trong phiên giao diện điều khiển để xem công việc này:

>> require 'rubygems' 
>> require 'hirb' 
>> Hirb.enable 

Để biết thêm về cách thức hoạt động, read this post.

+0

Cảm ơn bạn đã trả lời, nhưng tôi không tìm kiếm số trang; Tôi muốn xem mọi thứ trên một trang. – kikito

101

Nếu bạn đang tìm kiếm một giải pháp nhanh chóng một lần, chỉ cần sử dụng như sau:

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 

Tạo một vật cố JSON

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

Chính xác những gì tôi đang tìm kiếm, cảm ơn bạn! – kermitology

+0

Nó cho tôi 'NoMethodError: undefined method 'statements' cho # ' hoặc 'undefined method' statements 'cho # ':( – Magne

+4

Tập tin' statements.xml' ở đâu – SujitS

3

Sử dụng Hirb, bạn có thể chọn để đăng nhập chỉ Đầu ra Hirb thành một tệp văn bản. Điều đó làm cho bạn vẫn có thể thấy các lệnh bạn nhập vào cửa sổ bảng điều khiển và chỉ đầu ra mô hình sẽ chuyển đến tệp.

Từ Hirb readme:

Mặc dù quan điểm theo mặc định được in để STDOUT, họ có thể dễ dàng sửa đổi để viết bất cứ nơi nào:

# Setup views to write to file 'console.log'. 
>> Hirb::View.render_method = lambda {|output| File.open("console.log", 'w') {|f| f.write(output) } } 

# Doesn't write to file because Symbol doesn't have a view and thus defaults to irb's echo mode. 
>> :blah 
=> :blah 

# Go back to printing Hirb views to STDOUT. 
>> Hirb::View.reset_render_method 
+0

Cảm ơn vì điều này, chính xác những gì tôi đang tìm kiếm! – sbonami

2

Ngoài câu trả lời Veger, có là một trong những cách nhiều việc phải làm nó cũng cung cấp nhiều tùy chọn bổ sung khác.

Chỉ cần mở thư mục ray dự án của bạn và nhập vào lệnh: lệnh

rails c | tee output.txt 

tee cũng có nhiều lựa chọn khác mà bạn có thể kiểm tra bằng cách:

man tee 
Các vấn đề liên quan