Bash function for navigating any filesystem location
Creating a Bash function for navigating and autocompleting any filesystem directory #
Photo by Gabriel Heinzer on Unsplash
If you are like me, and spend all day typing on a keyboard, you start looking for ways to save yourself a keystroke here and there. This quest for ultimate performance led me to try and find a way to speed up navigating into a directory in my Bash terminal.
Why? #
There are many reasons why a method for quickly navigating into a directory might make sense. For example, long (or capitalized) directory names. Say that you find yourself having to navigate to /media/external/Code on a regular basis, because that is where your keep your repositories. Wouldn’t it be nice to have a quick alias to get yourself there instead of having to type out the path every time?
“But Damn Dot Engineer” I hear you say, “wouldn’t it be enough to create an alias for that specific cd command? Why write an article about this?”
Because I have a self-imposed article quota to fill. Also, because autocomplete. If I create an alias such as
alias cdc="cd /media/external/Code"
this will work for navigating to that specific directory. However, what if I want to continue navigating inside of that directory? Say for example my desired destination is /media/external/Code/www/site. To reach that directory with the above alias, I would have to do it in two commands:
cdc
cd www/site
That is hardly useful, is it? Instead, I wanted to have a command that would work the same way as the normal cd command does, allowing me to use [tab] for autocompleting paths, and for showing what is inside of a directory with a double [tab] press.
The Solution #
Lets build a simple solution, using nothing else than a couple of Bash functions.
Prerequisite #
This little helper uses the _cd built-in function. Most “regular” Linux distributions I have tried (such as my daily driver Ubuntu) already have this function included. However, I noticed that the official Ubuntu Docker image did not have it. You can check if your Bash has it by running these two commands:
bash --debugger
declare -F _cd
# _cd 1726 /usr/share/bash-completion/bash_completion
You should get output telling you where the function is declared (in my case above, it’s declared in /usr/share/bash-completion/bash_completion). If the output is empty, your Bash does not have the _cd function yet. To add it, install the bash-completion package, and then make sure these lines appear in your .bashrc:
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
The Bash function #
Add the following block at the end of your .bashrc, adjusting the cdc_path variable to the base path you want to navigate to:
### cdc command
cdc_path='/media/external/Code'
_cdc () {
declare CDPATH=
cd "$cdc_path"
_cd "$@"
}
complete -F _cdc cdc
cdc () {
if [ -z "$@" ]; then
cd "$cdc_path";
else
cd "$cdc_path"/"$@";
fi
}
###
What does this do?
First off, the _cdc function uses the _cd function to search for directories inside of cdc_path. The functionality is the same as that of the regular cd autocomplete. Any results are added to the arguments of the cdc command so that, upon pressing [enter], Bash navigates to that directory.
Limitations #
The _cdc function needs to navigate to cdc_path to be able to correctly autocomplete folders. If the operation is cancelled (for example, by pressing [ctrl]+[C] after using [tab] to see results), the terminal still ends up navigating to cdc_path. I have not found a simple way to avoid navigating away without breaking the autocomplete functionality. This is a minor bug for me, since it does not happen too often and a cd - gets me back to wherever I was originally.
Did you find this tip useful? Have any suggestions to improve it? Let me know in the comments below!