what does 'cd $_' mean?

I have seen this command in a tutorial to create a new directory:

mkdir my-new-project && cd $_

I know mkdir my-new-project command is used to create a new directory, but what does cd $_ do?


Solution 1:

$_ expands to the last argument to the previous simple command* or to previous command if it had no arguments.

mkdir my-new-project && cd $_

^ Here you have a command made of two simple commands. The last argument to the first one is my-new-project so $_ in the second simple command will expand to my-new-project.

To give another example:

echo a b; echo $_
#Will output:
#a b
#b

In any case, mkdir some_dir && cd $_ is a very common combo. If you get tired of typing it, I think it's a good idea to make it a function:

mkdircd() {
  #Make path for each argument and cd into the last path 
  mkdir -p "$@" && cd "$_" 
}

* The bash manual defines a simple command as "a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. " where control operator refers to one of || & && ; ;; ( ) | |& <newline>.

In practice$_ works like I've described but only with ||, &&, ;, or newline as the control operator.

Solution 2:

7. How to create directory and switch to it using single command. As you might already know, the && operator is used for executing multiple commands, and $_ expands to the last argument of the previous command.

Quickly, if you want, you can create a directory and also move to that directory by using a single command. To do this, run the following command:

$ mkdir [dir-name] && cd $_

For those coming from Udacity's Version Control with Git, HowToForge offers a great explanation, here.