※いままでシェルのヒストリ機能をあまり使ったことが無かったので、ヒストリ機能を使って作業した際に躓いた事についてのメモ。

bash, zsh で動作を確認

はじめにヒストリ機能についてのまとめ

ヒストリ機能を使うといままでの履歴を再利用することができます。

使用例bashzsh
historyコマンド履歴を表示同じ
history -r最近の履歴から表示同じ
history [number]最近の履歴から number で指定した件数分を表示最近の履歴から number で指定した履歴番号から表示
history -[number]無し最近の履歴から number で指定した件数分を表示
history -cコマンド履歴の削除無し
history -D無し実行に要した時間を表示
history -i無し実行日時を表示

 

ヒストリの共有

zsh では以下の設定を .zshrc に追加することで複数の端末の間でヒストリの共有を行えます。

setopt share_history

bash でも .bashrc に以下の設定を追加することで利用できるようです。

# こちらのサイトより引用いたしました。
# http://iandeth.dyndns.org/mt/ian/archives/000651.html

function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999

 

イベント指示子

イベント指示子 ( ! , !- , !! , ^ , etc…) を用いてヒストリ機能を使う事もできます。

使用例bash & zsh
!!直前のコマンドを実行
!nn 番目のコマンドを実行
!-nn 番前のコマンドを実行
!stringstring に指定した文字列より始まる最も最近のコマンドを実行
^before^after^直前のコマンドの文字列の before を after で置換し実行

補足:上の表について n単語指示子と呼ぶようです。


 

ヒストリ置換

ヒストリから文字列の一部を置換し実行することも可能です。

修飾子 
:p置換後のコマンドを表示するが実行しない
:q置換が行われた単語をクォートし、それ以上の置換を行わない
:s/old/new最初に現れた old を new に置換
:g置換を行全体に適応
:s/old/new/:g
:gs/old/new/
:gs のように組みわせて記述可能

ヒストリ番号を指定して以下のように文字列置換をし実行したい場合。

% history
...
255
256    cat sharp19.rb >> sharp20.rb
257
...
# ヒストリ番号256をこのように置換した後実行したい。
# cat sharp20.rb >> sharp21.rb

下記のようにすれば実現できます。

% !256:s/20/21/:s/19/20/:p

この場合 20 を 21 に置換えてから、 19 を 20 に置き換えることがポイントです。もしかすると、もっと簡単な記述方法があるかもしれません。

ここまで調べてわかったことですが。

イベント指示子、単語指示子、修飾子の詳細は Man page of BASH に書いてあることが判明しました。


 

おまけ

文字列の置換は sed コマンドを使った置換と似ています。以下に例を示します。

# 最初に見つけた検索文字列のみ置換
sed -e 's/検索文字列/置換文字列/' 入力ファイル

# 見つかった検索文字列を全て置換
sed -e 's/検索文字列/置換文字列/g' 入力ファイル

 

Tags:

コメントを残す

メールアドレスが公開されることはありません。