どうやって !!バッシュで働く?


34

コマンドの先頭でsudoを忘れた場合に非常に便利!!で、前のコマンドのエイリアスのように機能します。例:

$ mv /very/long/path/for/a/protected/sensible/file/caution.h .
(...) Permission denined
$ sudo !!
sudo mv /very/long/path/for(...) .
[sudo] password :
  • このダブル!!トリックをどのように呼び出すのですか?そのトークンのため、インターネットでの研究は困難です。
  • どのように機能しますか?historyコマンドとのリンクが疑われます。
  • 定義されている場所 他に自分で定義できますか?

編集:いくつかの興味深いイベント指定子

!!:*

前のコマンドの引数を参照します。使用事例 :

cat /a/file/to/read/with/long/path
nano !!:*

:p

コマンドを実行せずに印刷するだけで、イベント指定子の最後に配置する必要があります。

$ !-5:p
sudo rm /etc/fstab -f

詳細はこちら


3
読むman history
コスタス

1
これは、履歴展開の特殊なケースです!。シェルは、現在のシェルの履歴リスト内の一致するコマンドで始まる単語を展開しようとします。!!は、に相当する特別な場合で、次の!-1負の数は前のn番目のコマンドを指します。n!
-chepner

1
@Costas、もっと便利なことに、読んでくださいLESS='+/^HISTORY EXPANSION' man bash
ワイルドカード

回答:


34

!!bashマニュアルの「イベント指定子」という見出しの下にリストされています。

   An event designator is a reference to a command line  entry  in  the
   history list.  Unless the reference is absolute, events are relative
   to the current position in the history list.

   !      Start a history  substitution,  except  when  followed  by  a
          blank,  newline,  carriage  return,  = or ( (when the extglob
          shell option is enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command minus n.
   !!     Refer to the previous command.  This is a synonym for  `!-1'.
   !string
          Refer  to the most recent command preceding the current posi-
          tion in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current  posi-
          tion  in  the history list containing string.  The trailing ?
          may be omitted if string is followed immediately  by  a  new-
          line.
   ^string1^string2^
          Quick  substitution.   Repeat the previous command, replacing
          string1       with       string2.        Equivalent        to
          ``!!:s/string1/string2/'' (see Modifiers below).
   !#     The entire command line typed so far.

したがって!!、前のコマンドに置き換えられます。

シェルの履歴にはリテラル!!が含まれず、代わりに実行された実際のコマンドが含まれることに注意してください。

$ ls
[some output]

$ !! .
[same output]

$ history 3
  645  2016-08-25 17:40:55 ls
  646  2016-08-25 17:40:57 ls .
  647  2016-08-25 17:41:00 history 3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.