A shell provides a developer with an interface to the Unix system environment. Shells gather user input and executes applications based on that input. After processing the tasks, an executed application then displays the output. Another way to look at it is to say that the shell is an environment within which a user can run commands, applications, and scripts.
Just like there are different operating systems and programming languages, so, too, are there different flavors of shells programmers and system administrators can choose from. Each of these shells has its own set of commands and functions that come with them, as well as its own benefits and features.
What are Unix Shells?
One of the many things Unix shells have in common is the shell prompt. The shell prompt, or command prompt, is displayed by the shell, indicating user-inputted commands can be taken in. After inputting such commands and pressing the enter button, the shell determines the commands the user wants to execute or run by reading the first word of the statement (word being the first set of unbroken characters in this case).
The first Unix shell was authored by Stephen R. Bourne in the mid-1970s during his time at AT&T’s Bell Labs, situated in New Jersey. The subsequently dubbed “Bourne Shell” was first used on Unix systems and is usually referred to simply as “the shell”. A set of standards called the POSIX (Portable Operating System Interface for Unix) specified by the IEEE (Institute of Electrical and Electronics Engineers) codify what is usually needed for the compatibility of applications when they move from one Unix system to another. As it is also the shell that formed the basis of what a POSIX compliant shell should be, it is no wonder that it can be found in most systems.
What are the Types of Unix Shells?
There are two major types of shells in Unix systems: the “Bourne Shell” and the “C Shell”. These, in turn, have several subcategories of shells. The subcategories of the Bourne Shell are:
The different C-Type shells are:
- C Shell (csh)
- TENEX/TOPS C shell (tcsh)
The Bourne Shell
As mentioned before, the Bourne Shell is the first – and original shell – written by Steve Bourne. It is relatively compact and speedy compared to other Unix shells. A drawback to this shell is that it is lacking in interactivity features. For example, one way to access and recall previously executed commands is via a history log, which Bourne lacks. The Bourne Shell is also lacking in logical expression handling and arithmetic functions. The Bourne Shell is the default Unix shell for Solaris OS distributions and it is normally found installed at the location /bin/sh on most Unix distributions.
The C Shell
The C Shell is a Unix shell written by Bill Joy during his time at the University of California at Berkeley. It was created as an enhancement to Unix systems. Right away, you can tell it is distinguishable from the Bourne Shell in that it includes features of interactivity, including aliases and a command history. On top of that, C-shell includes arithmetic and a C-like syntax as some of its programming features. It is typically located with the file path: /bin/csh.
Ksh was written by David Korn at AT&T Bell Labs in the early 1980s and was made as a superset of the Bourne Shell. What this means is that it supports everything in the Bourne Shell, including support for running scripts written in – or for – the Bourne Shell.
Korn Shell is a Unix shell that features interactivity comparable to C Shell in that it includes arithmetic operations, functions, arrays, and string manipulation among its syntax. Korn, however, is notably faster than C Shell. Korn is installed at the location: /bin/ksh.
GNU Bourne-Again Shell
The Bourne-Again Shell, or Bash as it is affectionately called, is the Unix shell that was made to replace the default Bourne Shell. Compatible in every way, it incorporates features from both Korn and C Shell. This means that a user gets the syntax compatibility and cross platforming of the Bourne Shell and expands upon that with features from these other shells. In addition, Bash features arrow key functionality, as the arrow keys are mapped to command history recall and editing.
Tcsh, regarded as an improved version of the C Shell, is an open-source shell for Linux. Primarily, it is used as an interactive login shell and shell script command processor. This shell offers up several options, including a command-line editor, spell-checking, job control, configurable auto-completion in the command-line, and a history recall mechanism. This shell is recommended for programmers based on its C-like syntax, as those developers can use scripting features without any experience in sh or Bash.
Other Shell Options for Developers
Below are some additional shell options for programmers and developers, worthy of an honorable mention.
Fish (Friendly Interactive Shell)
This developer-oriented open-source shell was released in 2005 and was developed specifically to be easy-to-use and feature a simple user experience directly out-of-box. This shell is a recommended choice for new Linux users. Its stylized color-coding is helpful for new programmers as well, as it highlights syntax for easier readability. The Fish Shell’s features include tab completion, syntax highlighting, auto-completion suggestions, a searchable command history, and more.
Z-shell was designed as a modern-day innovative and interactive shell. Zsh offers a unique set of features on top of those from other Unix and open-source Linux shells including tcsh, ksh, Bash, and others. This open-source shell is easy-to-use, customizable, offers spell checking, auto-completion, and other productivity features. For users that want an advanced Linux shell, Zsh shell is recommended. Also, like Fish shell, the installation for Zsh is effortless and the open-source framework offers customizable options, as well as plugins, to better the user experience.
What Are Shell Scripts?
Shell scripts are a list of shell commands, written in order of execution, in a file. These scripts can also contain conditional statements like if, loops, file references, and variables that store and read data. These scripts are not compiled program files; rather, they are interpreted at the time of execution, as each line of the file is fed to the interpreter.
Here is an example of a shell script:
#!/bin/sh echo “what is your name?” read name echo “How are you, $name?” read sentiment echo “I am $sentiment too!”
A developer would write this script in their preferred text editor, such as nano, then save the text file with the .sh extension.
Once saved, programmers can then run this script file by running the command $ sh script_name.sh. When the script “reads” the stated variables in the code (like name and sentiment), it will wait for the corresponding user input.
The script header #!/bin/sh indicates which shell the script will be interpreted with. Depending on the shell language, you can run the same script across multiple shell interpreters, such as the header #!/usr/bin/env python, which would run this script through the Python interpreter.
Writing scripts better automates a developer’s environment in order to aid in the creation of a more efficient workspace. For example, a user could write a script to backup one or several files and have it run periodically. I encourage you to explore scripts that better assist in your software development process.
Conclusion of Top Unix Shells for Programmers
A shell offers developers and sysadmins a user interface in order to interact with the Unix environment, allowing one to run several commands at the same time. The goal of this Unix shell tutorial was to provide enough of a preview into some of the top choices of inline and open-source Unix shells so that programmers could further their research into how to choose the right shell. All of the options included in this shell guide have a use and a recommendation tied to them – Linux experts hold these in high regard for their unique features in Unix systems. You are encouraged to explore these shell options, finding the ones you want to default to, develop with, or better automate and control your software development environment with.