それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashヒストリのダイエット。bash履歴活用まとめ

Bashのヒストリをダイエットしました。ダイエットして減った分、よりたくさんのコマンド履歴が確保出来ました。


履歴を確保するとタイプ量が減って仕事早くなるッス。

重複する履歴を保存しない

重複するコマンドは最新一件に限定する。重複は保存しない

~/.bashrc
#重複履歴を無視
export HISTCONTROL=ignoredups 

Ubuntuなら最初から設定してあったように思える。

空白から始めたコマンドを保存しない

履歴に保存したくないコマンドは空白から記述する

~/.bashrc
#空白から始めたコマンドを無視
export HISTCONTROL=ignorespace
コマンド例
$ □cat /etc/passwd|grep takuya
  #↑空白入れることで保存されない。

空白を履歴に追記しない、重複履歴を保存しない

ignorespaceとignoredupsを同時に使う。

~/.bashrc
#ignorespace+ignoredups = ignoreboth
export HISTCONTROL=ignoreboth

よく使うコマンドは保存しない

よく使うコマンドは履歴保存対象から外す。

export HISTIGNORE="fg*:bg*:history*:cd*

とくにbashのジョブ切り替えfg/bgは、履歴保存してもほとんど意味がない。

さらにhistoryコマンドの履歴なんて不要でしかない。

もっといえば、lsや、cdも不要だろう。

cdの履歴無くて困りませんか?

結論:困りません。cd そのものに履歴機能があります

$ cd /var/www
$ cd /etc/apache2
$ cd - #このハイフンがミソ
$ pwd 
/var/www 

一個二個の履歴で足りないときはpushd/popdを使えばいい。つか3つ超えるならディレクトリ毎にScreen起動した方が楽じゃん。

最後にヒストリのサイズを増やす。

ダイエットした分、増やしましょう。

export HISTSIZE=10000

履歴を使いこなす

賢い履歴の使い方:検索

たくさん履歴があると検索で便利。ヒストリはCtrl+Rで検索しながら使う。

takuya@xion:~$ #ctrl+Rを押す
(reverse-i-search)`/etc/init.d': /etc/init.d/slapd restart

履歴番号を指定する。

履歴番号を指定して実行する。検索は知ってる人が多いけど、ヒストリ番号を指定して実行拝外とみんな知らないのね。

takuya@xion:~$ history | grep slapd | grep restart

  903  /etc/init.d/slapd restart

takuya@xion:~$ !903 #←『!』と番号

履歴の先頭・末尾へ移動と検索

履歴の使い方は次のコマンドを覚えれば大丈夫。

一つ前の履歴 CTRL+P または↑
一つ次の履歴 CTRL+N または↓
履歴を以前に向かって検索 CTRL+R
履歴を新しい方向へ検索 CTRL+S
履歴の先頭・最初に ESC
履歴の末尾・最後に ESC >


特に重要なのが履歴の末尾に移動するコマンド『ESC >』

ヒストリに時刻を導入する

コマンド履歴にコマンドを使った時刻を導入することが出来る。

.bashrc
HISTTIMEFORMAT='%Y%m%d %T';
export HISTTIMEFORMAT
導入後
 1388  20090830 13:31:15 sudo hg log
 1389  20090830 13:31:15 sudo hg log | more
 1390  20090830 13:31:15 hg ci -m "recover"
 1391  20090830 13:31:15 sudo hg ci -m "recover"
 1392  20090830 13:31:15 screen -dr

参考URL http://d.hatena.ne.jp/hirose31/20080117/1200552410

タイピングが人より遅い僕は履歴を活用することで何とか人並みに仕事が出来る。

履歴は重要。本当に履歴は重要です。

Screen使ってると履歴が消える

BashのHistoryは何も考えず上書きしてしまいます。Screenなど使って履歴を共有する方法

共有する方法はサイトを参考に

http://iandeth.dyndns.org/mt/ian/archives/000651.html

個人的には共有する方法はあまり好きじゃない。SCREEN端末毎にコマンドを使い分けてるからだ。でも好きな人は好き。

105 function share_history {  # 以下の内容を関数として定義
106 history -a  # .bash_historyに前回コマンドを1行追記
107 history -c  # 端末ローカルの履歴を一旦消去
108 history -r  # .bash_historyから履歴を読み込み直す
109 }
110 shopt -u histappend   # .bash_history追記モードは不要なのでOFFに
111 export HISTSIZE=9999  # 履歴のMAX保存数を指定
112
113 PROMPT_COMMAND="share_history"  # 上記関数をプロンプト毎に自動実施

なぜかインデントすると動かない。しばらくコレを使っていました。

共有が効き過ぎるとき

僕はヒストリのアペンド機能。終了時にヒストリを追記する。上書きで消してしまうことはしない。これだけで十分だった。
http://d.hatena.ne.jp/sppr/20090109/1231518070

# Make bash append rather than overwrite the history on disk
shopt -s histappend
# Whenever displaying the prompt, write the previous line to disk
export PROMPT_COMMAND="history -a"

失敗したコマンドの自動消去

ミスタイプしたコマンドの自動消去とかないかな。ファイルが見つかりませんとか。コマンドが見つかりませんは自動消去してくれて構わないんだけど。そんな機能が欲しいです。


Takuya with many mistypes