$ bash --version
GNU bash, version 3.2.17(1)-release (powerpc-apple-darwin9.0)
Copyright (C) 2005 Free Software Foundation, Inc.
で確認。
最後のコマンドの繰り返し
!!
直前のコマンドの再実行。一旦実行されるコマンドが表示され、その後実行される。
直前のコマンドの置換え
!!:s/【置換元文字列】/【置換先文字列】/
例
ls /home/user01/public_html
〜〜〜
!!:s/1/2/
ls /home/user02/public_html
〜〜〜
次の方法でも同じ事ができる。
^【置換元文字列】^【置換先文字列】^
こっちの方が入力が少なくてすむ。
どちらも直前のコマンドの先頭から【置換元文字列】を捜して、最初に一致したものを【置換先文字列】へ置換して実行する。
直前のコマンドで置換したいのが行の先頭だけではなく、一致するもの全ての場合は、こうする。
!!:gs/【置換元文字列】/【置換先文字列】/
^を使用する方法では全てを置換する方法は無いみたい。
s^【置換元文字列】^【置換先文字列】^ とかしてもcommand not foundって言われる。
直前のコマンドから引数を利用する
!$ 一番最後の引数
!:n n番目の引数
引数の一番初めが1。
!:0 は !! と同じ。つまり直前のコマンドが実行される。
当然存在しない引数を呼ぼうとするとエラー。bad word specifierって言われる。
!* 引数全て。
上記の入力結果の確認
最後に :p をつけると置き換えられた結果の実行されるコマンドが表示される(だけ)。
確認後 !! すればいい。
しかし、間違ってしまうと直前のコマンドはその間違ったものに変わるので要注意。
この方法はスクリプト内に記述してもダメ。command not foundって言われる。
Comments
ヒストリー
!!や^^を使用してコマンドを実行しても、ヒストリーに残るのは、!!などではなくて、置換後の実際に実行されたコマンド。
置換じゃなくって削除したい時
^【置換元文字列】^【置換先文字列】^ を使って
^【置換元文字列】^^ のようにすれば、【置換元文字列】が削除されるけれど、この場合は、
^【置換元文字列】^ でかまわない。