※いままでシェルのヒストリ機能をあまり使ったことが無かったので、ヒストリ機能を使って作業した際に躓いた事についてのメモ。
bash, zsh で動作を確認
はじめにヒストリ機能についてのまとめ
ヒストリ機能を使うといままでの履歴を再利用することができます。
使用例 | bash | zsh |
---|---|---|
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 |
---|---|
!! | 直前のコマンドを実行 |
!n | n 番目のコマンドを実行 |
!-n | n 番前のコマンドを実行 |
!string | string に指定した文字列より始まる最も最近のコマンドを実行 |
^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' 入力ファイル