`man bash`, search for section _Special Parameters_. For `_` you'll find: > expands to the last argument to the > previous command, _after expansion_. So in a command line context the difference is the expansion. For example if I have a variable `FOO` set to 'bar' and I execute `echo $FOO` then `$_` on the next line will display `bar` while `!$` will just display `$FOO` ---- Note that `$_` has different meanings in other contexts: > At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list. ...and... > Also set to the full pathname used > to invoke each command executed and placed in the environment exported > to that command. ...and... > When checking mail, this parameter holds the name > of the mail file currently being checked.