Navigating with Elegance

My dad used to tell me, “there’s always more than one way to get somewhere.” He used to take me with him everywhere via streets, dirt roads, freeways, back alleys, and highways. He would hardly ever take the same way twice. This was not only a key factor in nurturing my sense of direction but also made me realized that the knowledge of how to get somewhere is powerful. While most people cannot make a turn without the consensus of Siri, I prefer to go different ways and figure it out. Eventually, I’ll arrive at my destination with more knowledge of how to get there than before.

Getting Home

A similar experience happened when navigation through directories in my terminal. The de-facto command for changing directories is cd .

$ cd Projects

Before we were at the user’s home directory. How can we get back?

$ cd ~

The tilda expands to $HOME in shells (bash, zsh, etc.) Therefore we can also do the expanded command.

$ cd $HOME

Of course if all we want to do is get to the home directory we can use cd

$ cd

Moving Backwards

Suppose we want to go back to the last directory. Right now we are in this file path ~/Projects/learning-golang/concurrency

We can go back up to the learning-golang folder using dots

$ cd ..

But what if instead we want to reference some notes?

From ~/Projects/learning-golang/concurrency

$ cd ../notes/concurrency

We now sit in the directory ~/Projects/learning-golang/notes/concurrency . After looking at our notes we want to go back to the ~/Projects/learning-golang/concurrency directory. We can achieve this in one of three ways.

From where we are currently

$ cd ../../concurrency

From our $HOME directory

$ cd ~/Projects/learning-golang/concurrency

Or the most elegant route

$ cd -~/Projects/learning-golang/concurrency

The command cd -is a shorthand for $OLDPWD . $OLDPWD is a variable which holds the value of the previous directory. The shell keeps track of and changes this value. You can check this value at anytime

$ echo $OLDPWD/home/starlight/Projects/learning-golang/notes/concurrency

Following the Trail

What if there was a way we can keep track of the path we have traversed? Perhaps this path can be stored in the structure of a stack, a directory stack.

We will start at our $HOME directory.

$ pushd Projects$ pushd learning-golang$ pushd concurrency

The command pushd adds the directory to the directory stack at index 0 and changes into it. We can then print out the directory stack.

$ dirs~/Projects/learning-golang/concurrency ~/Projects/learning-golang ~/Projects ~

We can also see the directory stack as an indexed list.

$ dirs -v0	~/Projects/learning-golang/concurrency
1 ~/Projects/learning-golang
2 ~/Projects
3 ~

We can use the command popd to pop off the top of the directory stack, index 0, and change into the directory at index 1.

$ popd

Let us go back to into the concurrency directory.

$ pushd concurrency

Once again we want to check on some notes at ~/Projects/learning-golang/notes/concurrency .

$ pushd ~/Projects/learning-golang/notes/concurrency

However this time we also need to check some notes which are in the directory ~/Projects/learning-golang/notes/pointers-and-errors .

$ pushd ~/Projects/learning-golang/notes/pointers-and-errors

The directory stack print out shows the following.

$ dirs -v0	~/Projects/learning-golang/notes/pointers-and-errors
1 ~/Projects/learning-golang/notes/concurrency
2 ~/Projects/learning-golang/concurrency
3 ~/Projects/learning-golang
4 ~/Projects
5 ~

Now to get back to ~/Projects/learning-golang/concurrency we cannot simply do cd - since we have traversed into two separate directories. We can instead use popd .

$ popd~/Projects/learning-golang/notes/concurrency ~/Projects/learning-golang/concurrency ~/Projects/learning-golang ~/Projects ~$ popd~/Projects/learning-golang/concurrency ~/Projects/learning-golang ~/Projects ~

We are now in concurrency and can print out our directory stack to see what happened.

$ dirs -v0	~/Projects/learning-golang/concurrency
1 ~/Projects/learning-golang
2 ~/Projects
3 ~

The directory stack has shrunk and at index 0 is our current directory.

Going the Distance

Go forth now and traverse your directories with the knowledge of an ancient sailor who uses the stars.