Как сделать приложение командной строки ruby с помощью пейджера?
Я делаю инструмент командной строки с помощью Ruby. Он будет печатать много текста на экране. В настоящее время я использую Shell pipeline (may_app | more
) для этого. Но я думаю, что лучше иметь пейджер по умолчанию.
это так же, как то, что вы видите, когда execute git log
. Можно отключить пейджер с помощью git --nopager log
.
Я сделал довольно много работы google и найти один драгоценный камень:hirb , но это кажется немного перебор.
после многих попыток я использую shell обертка для этого:
#!/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" == "" ]; then
shift
$XRAY $*
else
$XRAY $* | more
fi
это работает. Но есть ли лучший способ?
2 ответов
Вы делаете все правильно. Но вместо этого с помощью more
вам лучше получить пейджер от $PAGER
переменная окружения, если таковая имеется.
некоторые люди предпочитают less
to more
например, и другие имеют свои любимые параметры парсера, установленные в этом var.
вы можете использовать трубу в Ruby через вызов system
и предоставить параметры (вместе с хорошим интерфейсом справки), как так:
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
теперь, вы поддерживаете --pager
и --no-pager
в командной строке, что приятно делать.