ターミナルでドキュメントを開く手軽なコマンドのless
ですが、
小さなものならcat
で良かったり、
サイズがそこまで大きく無ければvim
等のエディタで開いてみてしまったりすることが多いです。
というのもless
の機能を余り知らないのでvim
などで見た方が色々と便利だったりするので。
しかしless
も実は結構高機能で便利だったりするので知っていると
使えることも結構あります。
その辺の一歩踏み込んだless
の使い方について。
- less
- オプションのプレセット指定
- 表示中にオプションを切り替える
- シンタックスハイライト(source-hilight、ついでにlesspipe.shについて)
- 途中からエディタで開く
- 複数のファイルを扱う
tail -f
の代わりに使う
less
less
はMark Nudelman氏によって書かれたもので、今は
GNU Projectの一つです。
less
はBSD版が無いのでMacなどのBSDな環境でもLinuxなどと同じless
が入っています。
なので以下の話は基本的にどのシステムでも同じ事が言えます。
元々more
という、ファイルの中身を順に表示していくプログラムがありましたが、
これは上に戻る事ができないもので、
後ろに戻れたりする様により使い勝手を良くしたものがless
になります。
なので(?)、ヘルプを開くと
NAME
less - opposite of more
と書いてあります。
デフォルトの表示用のコマンドとして設定しているプログラム
も多くあり(man
の表示やgit log
の表示など)、
直接less
を叩かなくても使ってる機会は結構多いと思います。
man
とかがless
になってない場合は
PAGER
と言う環境変数がless
以外のものに設定されてるはずです。
export PAGER=less
とするとless
になります。
Vimなどのエディタより機能が少ない分、表示も高速なので
特に大きなファイルを開く際には見るだけならless
のが便利です。
また、コマンドの出力が長い時、パイプでless
に渡して読む、という使い方も良くあると思います。
何かのコマンドのヘルプを見たい時、1画面に収まらないようなことがあるので、そういった場合は
$ example_cmd --help | less
みたいなことを良くやります。
操作方法はvi
に従う様な形でJで下、kで上に進む様になっています。
検索等もvi
の操作と同じです(/
で開始、Nで次へ、など)。
後はQで終了、位を覚えておけばとりあえずは使えます。
困ったらHを押すとヘルプが出ます。
(たまにvi
(vim
)の操作と間違えて押して出てきてしまうときがある。。。)
ちなみに今使ってるMacだと/usr/bin/more
は実際にはless
になっています。
ハードリンクとかでも無いみたいですが、
more --version
とかするとless
のバージョン情報が出ます。
以前はマルチバイト表示ができなかったので、 jless (今はもう元ページがない) やさらに色々な機能が加わった lv と言ったコマンドをインストールして日本語ファイル等を開く必要がありました。
ですが現在のless
であれば日本語が普通に使える環境下であれば
大概の場合日本語表示も問題なく出来る様になっていると思います。
オプションのプレセット指定
LESS
という環境変数にオプションを指定しておくと
less
実行時にそのオプションを付けて実行してくれます。
1
|
|
今使っているのはこんな感じ。
-I
: 検索時に小文字で書いた場合大文字小文字を区別しない。大文字を入れると区別する。-R
: ANSIカラーコードなどを理解して色付き表示に。-M
: 現在表示中のファイル名や行数をプロンプトに表示。-W
: 2行以上進んだ時、新たに表示された最初の行を一時的にハイライトする。-x<number>
: タブ記号をnumber分のスペースとして表示。
他のオプションについてはman less
で。
-M
に関して、現在表示されている最初の行と最後の行の行数の表示がされ、
さらに全体の行数と今いる部分が何%目にあるのか、という表示がされます。
ただし、下に書くsource-highlightを使っていると 最初に表示した時点では全行数と%表示がされず、 一度一番下まで行くと表示される様になります。
表示中にオプションを切り替える
less
は表示を開始した後でもオプションを切り替える事が出来ます。
上にあげてないオプションで-N
という、各行の行数を表示するオプションがありますが、
less
を開始後、- Shift-Nを押してReturnを押せば
行数が表示されます。
もう一度押すと消えます。
シンタックスハイライト(source-hilight、ついでにlesspipe.shについて)
Vim等のエディターではソースコードなどに色を付けて分かりやすく表示することが出来ますが、
less
でもsource-highlightを使うと同じ様な事が出来ます。
GNU Source-highlight - GNU Project - Free Software Foundation (FSF)
インストールはMacでHomebrew、
$ brew install source-highlight
Linuxでyumやapt-get
$ yum install source-highlight
$ apt-get install source-highlight
で入れられます。
もしくは公式マニュアル にある様に手動で。
インストールしたら、/usr/local/bin(もしくは指定したパス)に src-hilite-lesspipe.shというスクリプトが入っていると思います。
これを
export LESSOPEN="| src-hilite-lesspipe.sh %s"
export LESS='-R'
の様に.bashrcなどで設定するとシンタックスハイライトをつけた状態でソースコードなどがless
出来る様になります。
LESSOPEN
はファイルなどを開く際に一度何らかの手を加えるためのコマンドを指定します。
src-hilite-lesspipe.sh
はファイルの種類などを見て適時シンタックスハイライトを
与えてくれるスクリプトです。
スクリプトの指定時の最初に|
を与えるのはこれがパイプ処理によるものだと伝えるためです。
%s
はless
に与えるファイル名になります。
もっと詳しくはman less
で。
LESS
の方は上にも書いたオプションセットで自由に設定して良いですが、-R
だけは忘れない様に。
これを付けないとESC [...m
の表示が沢山出てしまう状態になります。
さて、このsrc-hilite-lesspipe.sh
の中身を見てみると
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
こんな感じのスクリプトです。
中身を見るとsource-highlight
を使ってハイライト付きの出力を作っていることが分かります。
source-hilight
は入力テキストを色々なフォーマットでシンタックスハイライトを付けた
状態で出力してくれるプログラムです。
-f esc
でハイライトをエスケープシーケンスの形で出力してくれます。
他にもhtml
やlatex
といった出力も可能で、ファイルに保存すれば
ブラウザでハイライト付きのコードを見たりすることも出来ます。
スクリプトの中ではいくつか拡張子の種類によって場合分けをしていますが、
tar等の所ではsource-hilight
を使わずにlesspipe
というスクリプトを呼んでいる事が分かります。
lesspipe
は圧縮ファイル等のバイナリファイルの中身を表示してくれるスクリプトで
これをかます事でless
で圧縮ファイルの中身を見ることが出来ます。
なんですが、このlesspipe
はどのシステムに入っているものではないため
ここでエラーが出てしまう事があります。
$ less example.tar.gz
/usr/local/bin/src-hilite-lesspipe.sh: line 10: lesspipe: command not found
"example.tar.gz" may be a binary file. See it anyway?
みたいな。
ここでy
を押せば強制的に見ることは出来ますが、バイナリファイルを直接見るので良くわからない表示が出るだけです。
さらに、システムによってはlesspipe
が予め入っているものもありますが、
入っているスクリプトの名前はlesspipe
ではなくlesspipe.sh
であることがほとんどです(少なくとも見れる範囲では全部)。
lesspipe.sh
が予め入っている環境では、
1
|
|
というスクリプトが入っていて、これが/etc/bashrcから呼ばれる様になっています。
通常、個人の.bashrcで
if [ -r "/etc/bashrc" ];then
source /etc/bashrc
fi
みたいな感じで最初にシステムのbashrcを読み込むと思いますが、
これによってLESSOPEN
が予めlesspipe.sh
に指定してある場合があります。
なぜsrc-hilite-lesspipe.shの中でlesspipe.sh
ではなくてlesspipe
が
指定されているのかよく分かりませんが、
これだとせっかくのlesspipe
機能が使えないので、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
みたいなスクリプトを作って
1 2 3 4 5 6 7 8 |
|
みたいな感じで設定しておくとlesspipe
もきちんと使える様になります。
LESSOPEN
に.bashrc内で関数を作ってそれを与えてみようとも思いましたが、
その場合command not found
になってしまって上手く行きませんでした。
commnad
コマンドで探せるPATH
にある(もしくはフルパス指定で見える)コマンドファイルでないと駄目な様です。
なのでちょっと面倒ですがpipeファイルを用意して置いておく必要があります。
ソースコードとかをちょっと見たい時、エディタで見るほどでもなくても
色付きで見たいから、という理由でエディタで開く事が多いと思いますが、
less
でも色付きで開ければパッと見るにはless
のが便利だったりすることも。
ただし、上のオプションのところや下にもありますが、 いくつか弊害が起こるのでちょっと注意が必要です。
途中からエディタで開く
less
で開いても途中から編集したくなるときがあるかと思います。
そんな時はv
を押せばデフォルトエディタ(VISUAL
もしくはEDITOR
で指定されたエディタ、両方指定されてない場合はvi
)
で開き直します。
この場合、エディタを終了すると再びless
に戻ります。
複数のファイルを扱う
less
では複数のファイルを同時に開いて切り替えて見ることが出来ます。
$ cat a.txt
aaa
$ cat b.txt
bbb
$ less a.txt b.txt # or *.txt
aaa
a.txt (file 1 of 2) lines 1-1/1 (END) - Next: b.txt
みたいな感じで始まり、:n
で次のファイル、:p
で前のファイルに移ります。
Vimのコマンドラインモードみたいな感じですが、
Enterを押さないで
n
とかを打った瞬間にファイルの移動が完了します。
:n
: 次のファイルを開く:p
: 前のファイルを開く:x
: 最初のファイルを開く:d
: 現在のファイルをリストから削除する:e <file>
: 新たに<file>
をリストに加えて開く
辺りが関連するコマンド。
:e
だけは最後にEenterを押して決定する必要があります。
:n
を押し続けて最後のファイルに行くともう一度押しても最初のファイルには戻りません。
最初のファイルで:p
を押しても最後のファイルには行きません。
tail -f
の代わりに使う
数年前ですが、下のブログがちょっと話題になってたless +F
。
ログなんかを監視する時にtail -f <file>
とやると
新たな書き込みを表示し続ける様なことをが出来ます。
これと同じ事がless
でも出来て、
$ less +F a.txt
aaa
Waiting for data... (interrupt to abort)
とすると、ファイルへの追加記述をリアルタイムで表示してくれます。
さらに、ここでCtrl-Cを押すと
通常のless
状態になってファイルの中身を読むことが出来ます。
通常のless
状態からはShift-F
でまたtail -f
の様な状態に戻れます。
上のブログやそれに対する反応もtailなんて使わずにlessのが良いよということなんですが、
個人的にはtail
のが使いやすいかな、と思います。
終了数時にtail -f
ならCtrl-Cで終わりますが、
less +F
だとさらにQを押す必要があります。
必ずless
の通常モードで見る、と言った場合以外はむしろデメリットです。
それからless
の方が複雑なプログラムだからか、
実際にやってみるとless
の方はちょっとタイムラグがあります。
後、+F
が両方Shiftが必要という所も地味にだるい。
なのでalias t="less +F"
なんてやってもみましたが、
結局Ctrl-Cですぐ終わらないのが嫌で使ってません。
ただ、通常通りファイルを開いてもShift-F
を押せば追記を表示するモードになるので、
ログをless
で開いた後に追記がないかな、ということで使うことはたまにあるので
覚えておいて損はしないと思います
なんですが、上に書いたsource-highlight
を適用すると
+F
で始めても途中でShift-Fしても追記を表示してくれない状態になってしまいます。
この場合、-L
オプションを加えるとLESSOPEN
を無視する様になるので
alias t='less -L +F'
みたいにするとsource-highlight
を入れていてもt <file>
とすることでtailf -f
機能を使えます。
ただし通常のless
で始めてしまうと途中から追記状態にすることは出来ません。
見ているものが元々のファイルではなくてsource-hilight
のアウトプットなため。
なので始めてから-L
を打っても追記を表示させることは出来ません。
上のブログの中に複数のファイルを同時に監視したい時は
less
だと出来ない(正確には上に書いた複数ファイルを開いた状態で移動してShift-Fをして、とかしないといけない)、という事がありますが、
tail
でもその都度新しい追加文字とそのファイル名が表示される様な形になります。
そんな時はmultitail
やxtail
と言った複数ファイル監視に特化した
ソフトウェアを使うと便利だったりします。