• このエントリーをはてなブックマークに追加

はじめに

「あのコマンド,どんなオプション付けてたっけ?」なときに,毎回次のように検索してきました:

history -nnnnnn | grep word1 | grep word2 | ...

しかし,いい加減メンドウになってきたので,本日,その手間を省略するシェルスクリプトを書いてみました.たぶんzsh向けです.

使い方

hs [-nnnnn] word1 word2 ...

実行例

履歴数オプションなしの場合.デフォルトでは 1_000_000 としています:

/Users/issm % hs cpanm plack
  327  cpanm -v Plack Plack::Middleware::Session
  328  cpanm -v Plack
  402  cpanm -v Plack::Middleware::Session
23443  cpanm Path::Class Plack Router::Simple Text::Xatena Text::Xslate
23553  cpanm -v Plack
23578  cpanm -v Plack::Middleware::ReverseProxy
23579  cpanm -v Plack::Middleware::ReverseProxy
25863  cpanm -v Plack
25868  cpanm -v Plack::Middleware::Log::Minimal
26118  cpanm -v Plack
26195  cpanm -v Plack
26347  cpanm -v Plack Starman Plack::Middleware::Log::Minimal Plack::Session
26631  cpanm Plack::Middleware::ReverseProxy
30691  cpanm -v Plack::Session
32017  cpanm -v Plack
32035  cpanm -v Plack
33836  cpanm --look Plack
47706  cpanm -v Plack
53690  cpanm -v Plack::Middleware::RefererCheck
57915  cpanm Plack
58059  cpanm -v Plack
62212  cpanm -v Plack
97306  cpanm Plack
100454  cpanm Plack::Middleware::ReverseProxy
107070  hs cpanm plack
107073  hs cpanm plack
/Users/issm %

履歴数オプションを指定した場合:

/Users/issm % hs -10000 cpanm plack
97306  cpanm Plack
100454  cpanm Plack::Middleware::ReverseProxy
107070  hs cpanm plack
107073  hs cpanm plack
107074  hs cpanm -5000 plack
107075  hs cpanm plack
107076  hs -5000 cpanm plack
/Users/issm %

なお,history コマンドや grep コマンドに何かaliasしている場合,それらが影響します.

ソースコード

function hs () {
    n_hist_default=1000000
 
    n_hist=${1#-}
 
    if [ $1 != ''  -a  $n_hist != $1 ]; then
        shift
 
        if [ $n_hist -gt 0 ]; then
        else
            n_hist=$n_hist_default
        fi
    else
        n_hist=$n_hist_default
    fi
 
    words=($*)
 
    greps=""
    for w in $words; do
        greps="${greps} | grep ${w}"
    done
 
    # echo n: $n_hist
    # echo w: $words
 
    eval "history -${n_hist} ${greps}"
}

おわりに

これでヒストリ検索がラクになりました.

シェルスクリプトはほとんど書いたことがないため,上記のものを書くだけでも2時間くらいかかってしまいましたとさw

amazonさん