35

When running commands, sometimes maybe you need to run a command with the argument from the last command. How can you do this?

Of course, excepting the use of the arrow keys and Del keys: ...DelDelDel...Del<new_command>.

47

For example, if you run this command:

mkdir long_path_here/new_dir

most likely you'd want to go in the recently created directory. You can do this using next "shortcuts":

  • cd Esc. - type cd and after press Esc followed by . (not in the same time). If the previous command has no arguments, you will get the previous command itself.
  • cd !* - in this case you will get all arguments from the previuos command. If the previous command has no arguments, you will get nothing.
  • cd Alt+. - type cd and after press Alt and . (in the same time). In fact, using this way and continuing to press . (without to release Alt), you will get the last argument for every command from history. If a command has no arguments, you will get the command itself.

In general: <command> Esc. or <command> !* or <command> Alt+..

| improve this answer | |
  • wow, you saved me hundreds of hours i would have ended up wasting in next couple of years – pranavk Sep 22 '17 at 17:56
35

There are a few shortcuts if you want all of the arguments from the previous command, or just the last argument.

  • For all of the arguments: <command> !*
  • For just the last argument: <command> !$

Examples:

ls foo/ bar/
ls !* # Gives the results of ls foo/ bar/

ls foo/ bar/
ls !$ # Gives the results of ls bar/

If you want a single argument from a list of arguments from the previous command, you can use <command> !!:<argNumber>

Example:

ls foo/ bar/ baz/
ls !!:2 # Gives the results of ls bar/
ls foo/ bar/ baz/
ls !!:1 # Gives the results of ls foo/
| improve this answer | |
  • 2
    You only need one ! in the single arg version, e.g., !:2 . Assuming default bash. – belacqua Jun 6 '13 at 23:31
  • 3
    You can also use !^ in place of !:1. – Paddy Landau Jun 11 '13 at 15:48
7

Mentioned !* and !$ is a good thing, but when you need to do a little editing readline shortcuts come to help!

For instance, instead of the countless ...DelDelDel...Del you can just press Ctrl-a(jump to the start of the line) Alt+d(delete to the end of the word)

For more info man readline and search for Default key bindings.

| improve this answer | |
4

To take the nth argument from your previous command, type Alt+n+Alt_. For example, after:

$ echo 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

typing echo followed by Alt2Alt_ will give you this at the next prompt:

$ echo 2

The "screenshot" after you've hit Alt2 is:

(arg: 2) echo

You can repeat Alt_ multiple times to get the nth argument of previous commands in succession.

Another useful idea is to define alias r="fc -s". Then, you can do command substitutions:

$ echo 1
1
$ r echo=history
history 1
27755  history 1
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.