LoginSignup
6
2

More than 3 years have passed since last update.

【bash】`!-n$`ができるってそれもっと早く教えてよ!

Last updated at Posted at 2016-12-29

!-n!$は習ったしよく聞くけど、!-n$とかできないかなーできたらいいなーでも聞いたことないし、そんなニッチ(?)なのないかなーって思ってたけど、
試しにやってみたらできたよ!!!

ちゃんとした説明

bashの組み込みコマンドhistoryに付随する機能として、
以下は割と有名で説明されてる記事も多いかと思います。

  1. !-nで「n回前の実行履歴」を参照できる(例:!-2で2回前)
  2. !$で「直前の実行履歴の最後の引数」を参照できる
    • $の代わりに^で最初の引数を参照できる
    • $の代わりに*ですべての引数を参照できる

この2つを合わせた感じで、
!-n$で「n回前の実行履歴の最後の引数」を参照することもできるのです!!!

例:

$ echo hoge0
hoge0
$ echo hoge1
hoge1
$ !-2   # 2回前のコマンドを実行
echo hoge0
hoge0
$ echo hoge2
hoge2
$ echo !$   # 直前のコマンドの最後の引数を参照
echo hoge2
hoge2
$ echo hoge3
hoge3
$ echo !-2$ # 2回前のコマンドの最後の引数を参照
echo hoge2
hoge2

これを機会にman bashを読んでみたよ

  • !-n:xで「n回前の実行履歴のx番目の引数」を参照できる
  • !-n:x-yで「n回前の実行履歴のx番目からy番目の引数」を参照できる
  • !-n:0で「n回前の実行履歴のコマンド(引数なしのコマンド名単体、ということ)」を参照できる
  • 【重要】 最後に:pをつけると展開結果が表示されて、かつ最新の履歴に追加されるので、 確認してから !!や上矢印で 実行することができる

構文としては、以下のようになっています。
! {実行履歴(event)指定部} [ : {参照対象(word)指定部} ] [ : {修飾部} ]

  • 参照対象指定部が記号系だと区切り文字の:が省略できる
    • その結果、!-n$で「n回前の実行履歴の最後の引数」ということになる
  • 実行履歴指定部を省略すると直前の実行履歴が対象となる
    • その結果、!$で「直前の実行履歴の最後の引数」ということになる

おわりに

  • 「こんなん常識じゃん┐(´ー`)┌ 」と思っても、1年前まではwinサーバー向けに開発していた者ですのでお許しください:bow:
    • 記号系がぐぐらびりてぃが低いのが悪い()
  • man bashを読むのは大変だけど、history以外の部分も勉強になりました:grinning::sparkles:

参考


!#については別途記事にしました
【bash】ヒストリ機能での!#の使い途

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2