2010-03-17 1 views
59

na konsoli bash, jeśli mogę to zrobić:szyny - Przekierowanie wyjścia konsoli do pliku

cd mydir 
ls -l > mydir.txt 

Operator> oddaje standardowe wejście i przekierowuje je do pliku; więc otrzymuję listę plików w mydir.txt zamiast w standardowym wyjściu.

Czy istnieje sposób na zrobienie czegoś podobnego na konsoli szyn?

Mam rubinowe oświadczenie, które generuje dużo wydruków (~ 8k linii) i chciałbym móc go zobaczyć w całości, ale konsola tylko "pamięta" ostatnie 1024 linie. Więc pomyślałem o przekierowaniu do pliku - Jeśli ktokolwiek zna lepszą opcję, jestem uszy.

Odpowiedz

77

Można używać override $stdout przekierować wyjście konsoli:

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

Być może trzeba zadzwonić ten jeden raz:

$stdout.sync = true 

To przekieruje wszystkie dane wyjściowe do pliku. Jeśli chcesz tymczasowo przekierować dane wyjściowe, upewnij się, że przechowujesz oryginalną wartość $stdout, aby móc ją zmienić.

+0

Dziękujemy! Właśnie tego szukałem. – kikito

+2

To nie działało dla mnie, dopóki nie dodałem '$ stdout.sync = true'. Edytowane. –

+2

'$ stdout.reopen (" my.log "," w ")' wydaje się być bardziej eleganckim rozwiązaniem, widocznym na stronie: http://stackoverflow.com/a/2480439/21217 – dain

3

Jeśli napiszesz poniższy kod w swoim pliku środowiska, powinien działać.

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

Można również obrócić plik dziennika używając

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

Dla zalogowaniu operacje tylko Active Record związanych, można zrobić

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

ta pozwala także mieć inny rejestrator config/plik dla różnych środowisk.

+0

To jest pomocne, ale druga odpowiedź robi to, co chciałem w prostszy sposób. Dzięki za poświęcenie czasu na odpowiedź. – kikito

2

Użyj hirb. Automatycznie wyszukuje dowolne wyjście w urządzeniu, które jest dłuższe niż ekran. Umieścić to w sesji konsoli, aby zobaczyć tę pracę:

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

Więcej informacji na temat, jak to działa, read this post.

+0

Dzięki za odpowiedź, ale nie szukałem stronicowania; Chciałem zobaczyć wszystko na jednej stronie. – kikito

101

Jeżeli szukasz szybkiej jednorazowej rozwiązania, wystarczy użyć następujących:

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 

Utwórz urządzenie 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

Dokładnie tego, czego szukałem, dziękuję uprzejmie! – kermitology

+0

Dało mi to 'NoMethodError: undefined method 'statement' dla # ' lub 'niezdefiniowanych instrukcji '' dla # ' :( – Magne

+4

Gdzie jest plik 'commands.xml' zapisanie w systemie Nie mogę znaleźć pliku – SujitS

3

Korzystanie Hirb, można wybrać tylko zalogować Hirb wyprowadza do pliku tekstowego. Dzięki temu można nadal widzieć polecenia wpisywane w oknie konsoli, a tylko dane wyjściowe modelu będą przesyłane do pliku.

Od Hirb readme:

Chociaż poglądy domyślnie są drukowane na standardowe wyjście, mogą być łatwo modyfikowane pisać wszędzie:

# 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

Dziękuję za to, dokładnie to, czego szukałem! – sbonami

2

Oprócz odpowiedzi Veger, nie istnieje jeden więcej, aby zrobić to także zapewnia wiele innych dodatkowych opcji.

Wystarczy otworzyć katalog projektu szyny i wpisać polecenie: polecenie

rails c | tee output.txt 

tee posiada również wiele innych opcji, które można sprawdzić przez:

man tee