行数によってページャを変える


0. Contents

1. Concept
2. Script Source
3. How to Use


1. Concept

使用している端末よりも行数の多いファイルを閲覧する時には
less 等のページャを使うと便利である。
しかし、端末に納まるサイズの時にページャを使うのは無駄な気がする。
かと言っていちいち行数を確認するのは効率が悪すぎる。

といった思考の末に出来上がったサブルーチン。


2. Script Source

ソースは以下の通り (ダウンロード)。

#! /usr/bin/env bash

function spl(){
## 変数をセット
  local File Path Str Pager="${PAGER:-less}"
  declare -i {D,L}Num=0
  declare -a List

## 引数をチェック
  while (( $# > 0 )) ; do
    case "$1" in
      -l|--line)
        [ "$2" -gt 0 ] 2>&- && DNum=$2
      ;;

      -p|--pager)
        type -p "$2" 1>&- && Pager=$2
      ;;

      *)
        if [[ -r "$1" ]] ; then
          List[${#List[@]}]=$( < "$1" )

        else
          List[${#List[@]}]=$1
        fi && shift && continue
      ;;
    esac && shift 2 || {
      echo "error: $FUNCNAME: $1: Invalid option." 1>&2
      return 1
    }
  done

## 変数をチェック
  ## $File
  if (( ${#List[@]} > 0 )) ; then
    File=$( for i in "${List[@]}" ; do echo "$i"; done )

  elif [[ -t 0 ]] ; then
    echo "error: $FUNCNAME: No argument." 1>&2
    return 1

  else
    File=$( cat - )
  fi

  ## $LNum (表示行数)
  LNum=$( echo -n "$File" |grep -c '' )
  (( LNum > 0 )) || {
    echo "error: $FUNCNAME: No entry." 1>&2
    return 1
  }

  ## $DNum (端末の行数)
  (( DNum > 0 )) || DNum=$[ $( stty 'size' < '/dev/tty' |cut -d ' ' -f 1 ) - 2 ]

## メインルーチン
  if (( LNum > DNum )) ; then
    echo "$File" |${Pager}

  else
    echo "$File"
  fi
}
spl "$@"


3. How to Use

表示対象の決定順序は以下。

USAGE、OPTION は以下の通り。

USAGE: spl (Options) (File)...
   -l, --line [Num]
      : set lines (default: stty size)

   -p, --pager [Pager]
      : set pager command (default: $PAGER)