GNU Bash can be considered the standard shell in GNU/Linux systems. But, do you know that you tune your Bash to allow case-insensitive completion or create your own commands? In this article, I will show some ways to make Bash "your Bash" and more useful.
Even new users of GNU/Linux based distributions are aware, that there is a shell. In some cases, this is needed to do fine-tuning to your system. It is also a very nifty way to provide guides and configurations without putting tons of screenshots together.
On most GNU/Linux based distributions, you will find GNU Bash (Bash for all future mentions) as the default shell. The GNU Project itself also has an introduction to Bash as cited below.
Bash is the GNU Project's shell—the Bourne Again SHell. This is an sh-compatible shell that incorporates useful features from the Korn shell (ksh) and the C shell (csh). It is intended to conform to the IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools standard. It offers functional improvements over sh for both programming and interactive use. In addition, most sh scripts can be run by Bash without modification.
Tuning and Tweaks
I am using Bash for quite some time now. In many articles, you will also get an idea that there are other shells like ZSH or Fish. And very often, these are recommended to people, for simple changes, that can also be made in Bash.
Let's see how we can adjust Bash and decide afterwards, if we really want to replace the shell.
Tuning and tweaking bash can be done in multiple places. Furthermore, there are differences of the implementation, that are different from distribution to distribution. Some GNU/Linux distributions are differentiating between login shells and interactive shells, some are not. In case something is not 100% working for you, please check the Docs & Links section, where I have put some articles.
For this tutorial (and the coming articles), I am sticking to the below files and directories.
- /etc/profile.d/*.sh to change things globally (for all users)
- ~/.bash_profile or ~/.bashrc to change things for a single user
This should work on almost all RHEL'ish derivates and SUSE/openSUSE.
Shell Options (shopts)
Let's be honest: Almost all of us are victims of the default bias, when it comes to default tooling. I see many Linux users rather switching the entire shell, then configuring the default shell to their needs. For some, this makes sense - for others, not so much. So, let's see how we can configure Bash to our liking, without replacing it with Fish or ZSH.
cd without cd
One reason to change to ZSH is cd-without-cd. This means, that we can change into a directory, without using the "cd" command beforehand.
$ cd directory/ # should be the same as $ directory/
This can be done with a simple shell option. Just enter the below command, and you can start testing it.
# test in the running shell $ shopt -s autocd # make persistent (for the current user) $ echo "shopt -s autocd" >> ~/.bashrc
If you work a lot on the console, you may type in a wrong directory name, occasionally. The normal output would be something like "no such file or directory". Let's see how we can avoid this.
# default behavior $ cd Dowloads bash: cd: Dowloads: No such file or directory # enable cdspell $ shopt -s cdspell # new behavior $ cd Dowloads Downloads
There are way more options, and most of them are in the man pages for bash builtins. You can search for "shopt" after opening the man page via
man shopt. You will find much more in this man page, since it redirects you to the "Bash builtins" but, I am sure, you will find the section.
Another situation may be, to have some "custom commands" or short handles or (that's how it is officially named) aliases. An alias, is basically a redirection of a command, to another command.
Let's create a very minimal "ToDo App" for the command line with some aliases.
Create the ToDo list
First, we need to create a new list. Since we require only one, this is very easy.
# Regular "create" command $ touch ~/Documents/todo.md
It's a quite simple command, to create a file, if it is not existing. Typing this is a bit boring and not so intuitive. So, let's make an alias for it.
# Alias for the above command (current session) $ alias todo_create="touch ~/Documents/todo.md" # Persist the alias $ echo 'alias todo_create="touch ~/Documents/todo.md"' >> ~/.bashrc
This will create the new command "todo_create" for us and every time, we run it, the file will be created, if it does not exist already.
Edit the ToDo list
The next thing, we want to do is editing our ToDo list and write down some tasks.
# Regular edit command $ nano ~/Documents/todo.md
Same procedure as in the last section.
# Alias for the edit command $ alias todo_edit="nano ~/Documents/todo.md" # Persist the alias $ echo 'alias todo_edit="nano ~/Documents/todo.md"' >> ~/.bashrc
And now we can run our brand-new command and edit the ToDo list.
# Run the command $ todo_edit
Let's put in some content like the one below.
Check the ToDo list
Opening the editor for checking our ToDo list seems a bit intrusive. Normally, we just want to have a quick look. So, let's also create an alias for this.
# Regular check command $ cat ~/Documents/todo.md # Alias for the check command $ alias todo_check="cat ~/Documents/todo.md" # Persist the alias $ echo 'alias todo_check="cat ~/Documents/todo.md"' >> ~/.bashrc
And now we can run the new alias.
# Run our new alias $ todo_check # Keep pushin! - [ ] write article - [ ] tell about Bash - [ ] sync with Tom - [ ] find pictures
Checking and removing aliases
By the way, running the
alias command without any parameter will provide a list of already defined aliases. You may be surprised what your Linux distribution is already offering.
$ alias alias todo_check='cat ~/Documents/todo.md' alias todo_create='touch ~/Documents/todo.md' alias todo_edit='nano ~/Documents/todo.md'
And, in case you want to edit or remove the above defined aliases, you just need to edit or remove the above lines from your ~/.bashrc.
$ nano ~/.bashrc
Adding aliases to your workflow can be a massive time saver and productivity boost. You can add aliases for all kind of complicated commands. Here is a list of some ideas:
kubectl get namespace
cpshould always use
lsshould always use
As you can see, there are many options.
With the next articles, we will also have a look at more configuration options. You can expect something about prompts, openers and better tab completion.
Docs & Links
You can find a ton of articles about these two topics in the web.
As you can see, there are some options to customize your Bash. In some future articles, we will have a look at other options. In the meantime, I would be happy to know which aliases and shopts you are using and if you use other customization options.