| Events | Meaning | Example |
| ! |
Start a history substitution, except when followed by a space, tab, the end of the line, ‘=’ or ‘(’ (when the extglob shell option is enabled using the shopt builtin). |
|
| !n |
Refer to command line n. |
$ history
1 echo foo bar baz
2 history
$ !1
#Print command that will be saved in history
#+and executed
echo foo bar baz
#Actual execution
foo bar baz
|
| !-n |
Refer to the command n lines back. |
$ history
1 echo foo
2 echo bar
3 echo baz
4 history
$ !-3
echo bar
bar
|
| !! |
Refer to the previous command. This is a synonym for ‘!-1’. |
$ echo foo bar baz
foo bar baz
$ !!
echo foo bar baz
foo bar baz
|
| !string |
Refer to the most recent command preceding the current position in the history list starting with string. |
$printf '%s\n' foo
foo
$ echo bar
bar
$ !pri
printf '%s\n' foo
foo
|
| !?string[?] |
Refer to the most recent command preceding the current position in the history list containing string. The trailing ‘?’ may be omitted if the string is followed immediately by a newline. |
$printf '%s\n' foo
foo
$ echo bar
bar
$ !?ntf
printf '%s\n' foo
foo
$ !?bar
echo bar
bar
|
| ^string1^tring2^ |
Quick Substitution. Repeat the last command, replacing string1 with string2. Equivalent to `!!:s/string1/string2`. |
For more info, refer to `s/old/new/` in Modifiers section.
$ echo foo
foo
$ ^echo^printf '%s\n'^
printf '%s\n' foo
foo
|
| !# |
Repeat entire command line before this event. |
$ echo foo; echo bar; !#echo baz
echo foo; echo bar; echo foo; echo bar; echo baz
foo
bar
foo
bar
baz
|
| Words | Meaning | Example |
| 0 (zero) |
The 0th word. For many applications, this is the command word. |
$ echo foo
foo
$ !:0
echo
|
| n |
The nth word. |
$ echo foo bar baz
foo bar baz
$ echo !:2
echo bar
bar
|
| ^ |
The first argument; that is, word 1. |
$ echo foo bar baz
foo bar baz
$ echo !^
echo foo
foo
|
$ |
The last argument. |
$ echo foo bar baz
foo bar baz
$ echo !$
echo baz
baz
|
| % |
The word matched by the most recent `?string?` search |
$ echo foo
foo
$ printf '%s\n' bar
bar
$ !?ch
echo foo
foo
$ !% baz
echo baz
baz
$ !?bar
printf '%s\n' bar
bar
$ echo !%
echo bar
bar
|
| x-y |
A range of words; `-y` abbreviates `0-y`. |
$ echo foo bar baz
foo bar baz
$ echo !:2-3
echo bar baz
bar baz
$ !:-1
echo bar
bar
|
| * |
All of the words, except the 0th. This is a synonym for `1-$`. It is not an error to use `*` if there is just one word in the event - the empty string is returned in that case. |
$ echo foo bar baz
foo bar baz
$ printf '%s\n' !*
printf '%s\n' foo bar baz
foo
bar
baz
|
| x* |
Abbreviates `x-$` |
$ echo foo bar baz
foo bar baz
$ printf '%s\n' !:2*
printf '%s\n' bar baz
bar
baz
|
| x- |
Abbreviates `x-$` like `x*`, but omits the last word. |
$ echo foo bar baz
foo bar baz
$ printf '%s\n' !:0-
printf '%s\n' echo foo bar
echo
foo
bar
|
| Modifiers | Meaning | Example |
| p |
Print the new command but do not execute it. Printed command is saved in history, so you can use Ctrl+p to re-enter it in current prompt. |
$ echo foo bar baz
foo bar baz
$ !:p
#Printed, but not executed
echo foo bar baz
$ !:*:p
foo bar baz
|
| h |
Remove a trailing pathname component, leaving only the head (Actually, remove all after last `/`, including). |
$ echo foo /example/path/bar.txt baz
foo /example/path/bar.txt baz
$ !:p:h
echo foo /example/path
|
| t |
Remove all leading pathname components, leaving the tail (Actually, remove all before last `/`, including). |
$ echo foo /example/path/bar.txt baz
foo /example/path/bar.txt baz
$ !:p:t
bar.txt baz
|
| r |
Remove a trailing suffix of the form `.suffix`, leaving the basename (Actually, remove all after last `.`, including). |
$ echo foo /example/path/bar.txt baz
foo /example/path/bar.txt baz
$ !:p:r
echo foo /example/path/bar
|
| e |
Remove all but the trailing suffix (Actually, remove all before last `.`, including). |
$ echo foo /example/path/bar.txt baz
foo /example/path/bar.txt baz
$ !:p:e
txt baz
|
| q |
Quote the substituted words, escaping further substitutions. |
$ echo foo 'bar baz'
foo bar baz
$ !:p:q
'echo foo '\'bar baz'\'''
|
| x |
Quote the substituted words as with ‘q’, but break into words at spaces, tabs, and newlines. |
$ echo foo 'bar baz'
foo bar baz
$ !:p:x
'echo' 'foo' ''\'bar' 'baz'\'''
|
| s/old/new/ |
Substitute new for the first occurrence of old in the event line. Any delimiter may be used in place of `/`. The delimiter may be quoted in old and new with a single backslash. If `&` appears in new, it is replaced by old. A single backslash will quote the `&`. The final delimiter is optional if it is the last character on the input line. |
$ echo foo bar
foo bar
$ !:p:s/foo/baz
echo baz bar
|
| & |
Repeat the previous substitution. |
$ echo foo bar
foo bar
$ !:p:s/foo/baz
echo baz bar
$ printf '%s\n' foo
foo
$ !:p:&
printf '%s\n' baz
|
g a |
Cause changes to be applied over the entire event line. Used in conjunction with `s`, as in gs/old/new/, or with `&`. |
$ echo foo bar foo
foo bar foo
$ !:p:gs/foo/baz
echo baz bar baz
|
| G |
Apply the following ‘s’ modifier once to each word in the event. |
Result is same as in `g` modifier
|