bash: 直前のコマンドを利用して楽をする方法

ヒストリーに残った直前のコマンドを加工してコマンド入力を楽にする方法を紹介する。

Contents

直前に実行したコマンドをもう一度実行

直前に実行したコマンドを実行するコマンドは !! である。


$ echo 'Hello'
Hello
$ !! # 直前のコマンドを実行
echo 'Hello'
Hello

!! は sudoを付け忘れて Permission denied のエラーが出たときに便利だ。


$ rm /path/to/file
rm: Permission denied

$ sudo !! # sudoを付けて直前のコマンドを実行

直前のコマンド引数を使う

直前のコマンド引数を参照するには !$ を使う。
コマンドを実行したら大量に出力が流れて、「さっきの引数なんだっけ?」というときに便利。


$ touch /path/to/file

$ echo !$ 
echo /path/to/file
/path/to/file

よくある使い方としては、touchした後に chmod !$でパーミッションを変えるとか、
ls した後に rm で削除するとき。


$ touch /path/to/file

$ chmod 666 !$ # 直前で利用した引数を参照してchmod
chmod 666 /tmp/test

$ ls /path/to/file/which/should/be/removed

$ rm !$
rm ls /path/to/file/which/should/be/removed

直前のコマンドの一部を変更して実行

直前のコマンドを置換するには ^ を使う。


echo hoge
hoge
$ ^hoge^fuga # 直前のコマンドのhogeをfugaに置換して実行
echo fuga
fuga

^ は最初に現れた文字を1度だけ置き換える。
引数を変えるために使うことが多いが、コマンドのほうを置換することもできる。


$ cat /path/to/file
$ ^cat^rm # 直前のコマンドのcatをrmに置換して実行
rm /path/to/file 

直前のコマンドを参照する !! を元に置換すればもっと複雑な置換もできる。


echo hogehoge
!!:gs/hoge/fuga/ #直前のコマンドに含まれるhogeを全部fugaに置換
echo fugafuga
fugafuga

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です