2011-12-13 29 views
6

Tôi đang tạo một công cụ dòng lệnh bằng Ruby. Nó sẽ in rất nhiều văn bản trên màn hình. Hiện tại, tôi đang sử dụng đường ống vỏ (may_app | more) để làm như vậy. Nhưng tôi nghĩ tốt hơn là nên có một máy nhắn tin mặc định.Làm thế nào để tạo một ứng dụng dòng lệnh ruby ​​với máy nhắn tin?

Giống như những gì bạn thấy khi thực hiện git log. Người ta có thể vô hiệu hóa máy nhắn tin bằng cách sử dụng git --nopager log.

Tôi đã thực hiện khá nhiều công việc của Google và tìm một loại đá quý: hirb, nhưng có vẻ như một chút quá mức cần thiết.

Sau nhiều cố gắng, tôi hiện nay sử dụng wrapper vỏ để làm như vậy:

#!/bin/bash 

# xray.rb is the core script 
# doing the main logic and will 
# output many rows of text on 
# screen 
XRAY=$HOME/fdev-xray/xray.rb 

if [ "--nopager" == "$1" ]; then 
    shift 
    $XRAY $* 
else 
    $XRAY $* | more 
fi 

Nó hoạt động. Nhưng có cách nào tốt hơn không?

Trả lời

3

Bạn đang làm đúng. Nhưng thay vì sử dụng more, bạn nên có một máy nhắn tin từ biến môi trường $PAGER, nếu có.

Một số người thích less đến more ví dụ và một số khác có tùy chọn trình phân tích cú pháp yêu thích được đặt trong biến này.

+0

Lời khuyên tốt! Cảm ơn, zed. – qhwa

2

Bạn có thể sử dụng các đường ống trong Ruby qua một cuộc gọi đến system và cung cấp các tùy chọn (cùng với một giao diện giúp đẹp) như sau:

require 'optparse' 

pager = ENV['PAGER'] || 'more' 

option_parser = OptionParser.new do |opts| 
    opts.on("--[no-]pager", 
      "[don't] page output using #{pager} (default on)") do |use_pager| 
    pager = nil unless use_pager 
    end 
end 

option_parser.parse! 

command = "cat #{ARGV[0]}" 
command += " | #{pager}" unless pager.nil? 
unless system(command) 
    STDERR.puts "Problem running #{command}" 
    exit 1 
end 

Bây giờ, bạn hỗ trợ --pager--no-pager trên dòng lệnh, đó là tốt đẹp để làm.

+0

Điều này khác với những gì tôi muốn. Tôi muốn sử dụng máy nhắn tin ra khỏi 'hệ thống'. – qhwa

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