bash で前のコマンドの引数だけを使用する

コマンドを実行するときに コマンドの前に echo を付けて試してみることがあります。

$ export testfile=dummy.txt
$ echo rm $testfile
rm dummy.txt

この後、echo を消して実行するわけですが !* を使うことで 同じことを簡単に実行できます。

$ export testfile=dummy.txt
$ echo rm $testfile
rm dummy.txt

$ !*
rm $testfile
rm: cannot remove `dummy.txt': No such file or directory

!* には、前に実行したコマンドの「コマンドより後ろのワード」が格納されるため echo の後ろから実行されるわけです。

!^ だと「コマンドより後ろのワード」の先頭、 !$ が「コマンドより後ろのワード」の最後になります。

$ echo 1 2 3 4 5
1 2 3 4 5

$ echo !^
echo 1
1

$ echo 1 2 3 4 5
1 2 3 4 5

$ echo !$
echo 5
5

ちなみに前に実行したコマンド全体は !! に格納されるため !! だけだと、前のコマンドを再実行になります。

$ echo 1 2 3 4 5
1 2 3 4 5

$ !!
echo 1 2 3 4 5
1 2 3 4 5

ちなみに、この「コマンドより後ろのワード」はパイプやリダイレクトも含みます。

$ echo 1 2 3 4 5 > /tmp/test.txt

$ echo !$
echo /tmp/test.txt
/tmp/test.txt

使うときは、ちょっとだけ注意です。

Google サイト内検索

Amazonアソシエイト