読者です 読者をやめる 読者になる 読者になる

$ service ssh0 start

from everything import *

ぼくのかんがえたさいきょうのbash_history活用法

Ubuntuを使っていると,GUIで操作できるところは多いとはいえ,ターミナルで作業することも多くあります.ということで,今回はターミナルでの作業効率を格段に向上させる,bash_historyの活用方法を紹介したいと思います.

bash_historyの活用(基本編)

せっかく今までググりながら苦労していろんな操作をしてきたのに,そのコマンドや細かいオプションが思い出せなくて,また検索したりmanをたたいたりするのは,非常に骨が折れます.historyコマンドを使えば,今までに使用したコマンドをズラッと表示することができます.たとえば,

$ history

~~~~~~~~~~~~~~

1~2598番目の履歴

~~~~~~~~~~~~~~

2599 cd Workspace/python/

2600 vim .bashrc

2601 sudo apt-get update

$

のようになります.

$ history | grep 検索したい文字列

とすれば,特定の文字列を含む履歴を検索することができます.

もし目当ての履歴が見つかったなら,

$ !2600

のようにすれば,番号2600のコマンド(ここでは"vim .bashrc")を実行することができます.

また,もっと便利なのは,Ctrl+Rで出てくる履歴検索です.

Ctrl+Rを押すと,

$ (reverse-i-search)`':

と表示されます.この状態で"rsy"と打ちます.すると,

$ (reverse-i-search)`rsy': rsync -av --delete /home/yuzugosho/Dropbox/Workspace/ /home/yuzugosho/Workspace/': 

のように,履歴の下の方から,これに合致するものを表示してくれます.次の候補に移るにはもう一度Ctrl+Rを押せばいいです.Enterを押せばそのまま実行できますし,Escキーで検索モードを抜ければ,編集して実行することができます.よく使うコマンドで,オプションが多いようなものも,これで簡単に扱うことができ,文字をたくさん打たなくて済みます.ただし,打ち間違えてしまったり,別の履歴の部分で検索モードから抜けてしまったりすると,同じ端末でもう一度Ctrl+Rをしてもうまくいかないので注意が必要です.(ちなみに上のコマンドは,ディレクトリ"/home/yuzugosho/Dropbox/Workspace/"の中身を,"/home/yuzugosho/Workspace/"に移すものです.変更のあったファイルを表示し,更新,存在しないファイルは削除されます.研究室のPCと自分のPCで,Dropboxを使ってファイルを共有しているのですが,Dropbox内のファイルを直接編集するのには抵抗があったので,一つクッションを置くことにしています.)

bash_historyの活用(設定編)

次に,bashの起動時に読み込まれる~/.bashrcの編集を行って,履歴の重複を消したり,複数の端末を立ち上げたまま履歴を共有したりする方法についてまとめます.

履歴が重複しないようにする

デフォルトの状態では,

$ cd

$ ls

$ cd

のようにすると,このcdは2つとも記録されます.これは時刻もつけて履歴を保存したいような場合でなければ,無駄な気がしますね.~./bashrcに,

export HISTCONTROL=erasedups

のようにして,変数HISTCONTROLに"erasedups"をつけると,コマンドを保存する際,履歴中に同じものがあれば,古い方を削除して新たに追記してくれます.直前のコマンドと重複しないようにするためにはignoredupsをつければよく,他にもコマンドのはじめにスペースをつけたものは記録しないようにするignorespace,ignoredupsとignorespaceをまとめたignorebothがあります.これらはコロン(":")でつなげることにより,複数指定することが可能です.

また,"history"や"exit","cd","ls"などはよく使うので,最初から保存しない,というのも手です.

export HISTIGNORE=history:exit:?:??

などとしておくと,"history","exit",1文字と2文字のコマンドは保存されなくなります.ただ,僕はこの機能は使っていません.

参考:「HISTCONTROL=erasedups」でbashのhistoryで重複コマンド削除 - end0tknrのkipple - web写経開発:

複数の端末で履歴を共有したい

次に,端末を複数立ち上げた際に,履歴をリアルタイムで更新する方法をまとめます.通常,コマンドの履歴は端末が閉じられる際に記録されます.これだと,片方で作業していて,同じようなことをしたいときに,また一から打ち直す羽目になることもしばしばです(役割分担させたい,つまり,独立して履歴をもって欲しい,という場合も,あるにはあるのですが・・・).その場合,~/.bashrcに以下のように記述するとこれを実現できます.

export PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

shopt -u histappend

historyをこのようなオプションをつけて順番に並べることにより,重複なくリアルタイムにファイルに書き込み,そして端末ごとの履歴にも上書きされていきます.参考の1とは異なり,histappendは無効にしてあります.

参考:

1. "ignoredups" and "erasedups" setting conflict with common history across sessions - Unix & Linux Stack Exchange:

2. Bash Reference Manual - Bash-History-Builtins:

複数のPCで履歴を共有したい

最後に,僕の場合,研究室でもubuntuを常用しており,家で使用した履歴と共有したい,ということがあります.そこで,Dropboxのファイル共有機能を使って,

export HISTFILE=$HOME/Dropbox/bash_history

としてDropboxディレクトリの中に保存用ファイルを作り,そこを参照するようにしました.このようにすると,端末はおろか,異なるPC間で履歴が共有でき,作業が捗ること間違いなしです.(たまに競合してしまうのはご愛嬌.)

その他の設定

履歴の保存数も変えることができます.

export HISTSIZE=5000

export HISTFILESIZE=5000

とすれば,ファイル上で5000,historyコマンドで参照される履歴が5000となります.今のところ足りてるので問題ありませんが,もう少し増やしてもいいですね.

まとめ

というわけで,bash_historyの活用について備忘録も兼ねてまとめました.もちろんUbuntuだけではなくて,他のLinuxディストリビューションMacでももちろん使えます.(bash以外はだめだと思いますが・・・)

WindowsではGUIしか使ってなかった僕ですが,1年間Ubuntuを触ってきて,最近やっとCUIの良さに気付けたように思います.CUIの良さは,全て履歴として残し,参照できることです.そして履歴が残っていれば,自動化も簡単! CUIの最大の強みである履歴をもっと活用したいですね.

今後改良する点としては,コマンドの実行時に成功判定をして,打ち間違いなどは履歴に保存しないようにすることです.どうしたらいいんや・・・