Very useful when you forget a sudo at the beginning of your command, !! acts like an alias of the previous command. Example :
$ mv /very/long/path/for/a/protected/sensible/file/caution.h . (...) Permission denined $ sudo !! sudo mv /very/long/path/for(...) . [sudo] password :
- How do we call that double
!!trick ?
Researches over internet are difficult because of that token. - How does it work ? I suspect a link with the history command.
- Where it is defined ? Can I define some other myself ?
EDIT : Some interesting event designators
!!:*
It refers to the arguments of the previous command.
Use case :
cat /a/file/to/read/with/long/path nano !!:*
:p
Just print the command without executing it, you have to put it at the end of the event designator.
$ !-5:p sudo rm /etc/fstab -f
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
!! is listed in the bash manual under the heading “Event Designators”:
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.
So !! will be replaced with the previous command.
Note that the shell history will not contain the literal !! but instead the actual command that was executed:
$ 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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0