Introduction to Linux Shell

By | 13/11/2012

We can say, the shell (also termed as the command line interpreter) is as old as the Unix operating system. The first Unix shell, called the Thomson Shell,  was developed by Kenneth Thompson in 1971. However, with time and technology, the idea of shell has propagated to the presently available number of shells which we use so commonly and easily on Linux Operating System. This  article is dedicated to understanding the current definition of shell and its supported features and functionality.

Understanding Shell

A shell in present world is a program which parses and runs supported commands along with several other features to assist in general and routine use in Linux. The way these commands are run in most of the cases, is by passing them to the operating operating system to execute the corresponding executable.

Now, one may think, the above explanation boils down to a Linux terminal. Then why are we calling it a shell every time. Well, Linux shell is different from a Linux terminal the same way, a program varies from its GUI interface. Hence, a terminal just gives us a medium to access and use the Linux shell. It could be a KDE terminal (Konsole) or a Gnome terminal (terminal).

Once the Linux Operating system boots successfully, check out for a terminal emulator. It looks like following figure 1.1



Types of Shells available

In Linux itself, there could be different shells depending upon how they are implemented and the commands they support. Here is a broad list of generally available ones:

  1. Bourne Shell
  2. Korn Shell
  3. C-Shell
  4. Bourne Again Shell (Bash)

These Linux shells differ in their own ways in terms of support and features available, as in, Username-lookup, history, aliases. Don’t worry if you don’t understand the jargon. You’ll get familiar as you read, learn and self explore Linux Shell.

The following table taken from this link  that summarizes the basic differences between all the available shells. One can refer this table to decide which one suits the best.

                                    sh   csh  ksh  bash tcsh zsh  rc   es  
Job control                          N    Y    Y    Y    Y    Y    N    N  
Aliases                              N    Y    Y    Y    Y    Y    N    N  
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y  
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y  
Directory stack                      N    Y    Y    Y    Y    Y    F    F  
Command history                      N    Y    Y    Y    Y    Y    L    L  
Command line editing                 N    N    Y    Y    Y    Y    L    L  
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L  
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L  
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L  
User name look up                    N    Y    Y    Y    Y    Y    L    L  
Login/Logout watching                N    N    N    N    Y    Y    F    F  
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L  
Username completion                  N    Y(2) Y    Y    Y    Y    L    L  
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L  
History completion                   N    N    N    Y    Y    Y    L    L  
Fully programmable Completion        N    N    N    N    Y    Y    N    N  
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N  
Co Processes                         N    N    Y    N    N    Y    N    N  
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N  
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N  
Periodic command execution           N    N    N    N    Y    Y    N    N  
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y  
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N  
Spelling Correction                  N    N    N    N    Y    Y    N    N  
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y  
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc  
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y  
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F  
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N  
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y  
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N  
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N  
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y  
Can specify startup file             N    N    Y    Y    N    N    N    N  
Low level command redefinition       N    N    N    N    N    N    N    Y  
Has anonymous functions              N    N    N    N    N    N    Y    Y  
List Variables                       N    Y    Y    N    Y    Y    Y    Y  
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y  
File no clobber ability              N    Y    Y    Y    Y    Y    N    F  
Local variables                      N    N    Y    Y    N    Y    Y    Y  
Lexically scoped variables           N    N    N    N    N    N    N    Y  
Exceptions                           N    N    N    N    N    N    N    Y

Key to the table above.

Y      Feature can be done using this shell.

N      Feature is not present in the shell.

F      Feature can only be done by using the shells function mechanism.

L      The read line library must be linked into the shell to enable this Feature.

Notes to the table above

1. This feature was not in the original version, but has since become almost standard.

2. This feature is fairly new and so is often not found on many versions of the shell, it is gradually making its way into
standard distribution.

3. The Vi emulation of this shell is thought by many to be incomplete.

4. This feature is not standard but unofficial patches exist to perform this.

5. A version called ‘pdksh’ is freely available, but does not have the full functionality of the AT&T version.

6. This can be done via the shells programmable completion mechanism.

7. Only by specifying a file via the ENV environment variable.


Besides, Linux also categorizes its shells into types such as restricted and remote shells. Restricted shells (rssh) are the ones which provide limited privileges to the shell end users by the administrator. Limited privileges maybe limited command set.

Remote shell (rsh) as the name suggests are the shells which are useful for remote access to a Linux Machine. It connects to the host machine and sends them commands.

Getting started with Shell

As you access the shell through terminal, you see a cursor which continuously prompts you to write something. You need not worry, its just doing its job. After all, shell understands only what we write, and what we write are the commands. Lets get started with writing and learning a few commands. We shall be discussing a few standard Linux commands.


Before we begin anything about this command, just try it. Type “ls” on your terminal and press enter. In my system, I see

aprograms  Documents   Music  Public  TPWQ_C_Rupali

Yes, it lists all the files and directories on the path you are at. That’s exactly what this command does. There are a few options available with this command like:

ls -l

This lists the files and directories with all their attributes, as in (output in my system):

total 64
drwxrwxr-x 6 entropic entropic 4096 Oct  8 19:53 aprograms
drwxr-xr-x 2 entropic entropic 4096 Sep 14 21:07 Documents
drwxr-xr-x 2 entropic entropic 4096 Sep  5 21:19 Music
drwxr-xr-x 2 entropic entropic 4096 Sep  5 21:19 Public
drwxrwx--- 3 entropic vboxsf   4096 Oct  3 12:51 TPWQ_C_Rupali

Another option,

ls -a

This includes the hidden files and directories too, as in (output in my system):

.                  .fontconfig      pk
..                 .gconf           .profile
.adobe             .gnome2          Public
aprograms          .pulse           .bash_history
.bash_logout       .bashrc          Documents         
.cache             .java            TPWQ_C_Rupali
.config            .local           .macromedia   
.mozilla           .vimrc           Music

For more options, you can refer to its man page

man ls

or its complete usage through

ls --help


To see, which directory you are in, type


For brevity and convenience of future reference, I am listing most of the commonly used commands in Linux. Note, all the options and usage details should be taken from man page or help (using –help option).


COMMAND Description Example
ls Lists current directory contents $ls
mkdir creates a new directory $mkdir mydir
cd change directory $cd mydir
pwd present working directory $pwd
cp copy the source to destination $cp sourcefile destfile
mv move the source to destination $mv sourcefile destfile
rm remove the file/directorty $rm myfile
$rm -r mydir
cat displays the contents of the file $cat myfile
man opens the manual page $man cat
info detailed info $info
echo display a line of text $echo “Linux Shell”
export set a value for environment/local/system variables $export VAR=1
find find files $find mydir -name myfile
grep find a text in files $grep “linux” mydir/
ps list current processes $ps
date shows today’s date $date
time shows current time $time
clear clears the terminal $clear
fg switches to foreground job $fg
bg switches to background job $bg
history history of commands $history
help basic help $help
exit exits the shell and closes the terminal. $exit

Worth mentioning, another interesting command to know which shell one is working on is is

$ echo $SHELL

In my case, output is


Check out yours?


Highlights and Conventions of Linux Shell

Every shell provides certain set of features, which I call highlights. They are not standard but depends on the implementations and are there to make our experience really convenient and smooth. Its actually fun to use these, so here they are:

(Note: All these highlights are well tried on bash shell )


Many times we need to provide paths or maybe absolute paths in the commands, however typing the complete or maybe relative paths could be pain. As a relief, Linux bash shell comes with an auto-complete option. As you type each letter and press tab, it searches the relevant options available and tries to complete depending upon the feasible options.

If it has just one feasible option, it auto-complete. In other cases, it just lists the feasible options for us to type the next letter. This also works for the commands. For example, try

$cd /ho


Aliases are used to abbreviate our long commands if they are frequently used. For example, if we use clear command a lot, we can alias it to just ‘c’.

alias c=clear

Now, whenever you type ‘c’, it clears the terminal screen.

Directory Separator [ / ]

This is conventional to Linux Shell rather than a highlight to use forward slash ‘/’ as a directory separator.
For example,


Command Separator [ ; ]

Multiple commands can be run at one go separating each with a semi-colon (;).
For example,

$mkdir mlb; cd mlb; ls

Pipes[ | ]

Output of one command can be given as input to another command. This is done through pipe. Can be understood better with an example.
For example,

$ls | grep mlb

It lists the files/directories in current directory and searches for text “mlb” in the output.


Executing commands by taking the input parameters from the standard input.
For example,

$cat myfile | xargs mkdir

The contents of myfile is “mlb”, so above command create a directory of name “mlb”.

Running executable [ ./ ]

An executable in the current directory is run by


However, there is a way to avoid prefixing ./ while running an executable. If we add the path of our executable to the Linux Environment variable “PATH”, executable can be run from any path just like a command. One can find more details in

Running executable in bg [ & ]

If we want the executable to run in background, we add ‘&’
For example,

.$./executable &

A foreground process is one, which is interacting with the use as it is running. One cannot run the next process in the terminal unless the running foreground process is complete or killed. However, a background process runs separate of the terminal/console and needs no further terminal related interaction from the user.

cwd [ . ] parent [ .. ]

The current directory is by convention represented by a dot and if we want to go to parent directory, i.e. one directory up, we use two dots i.e. ..
For example, for current directory,

ls .

, for parent directory,

ls ..

Killing running fg job [ctrl + c]

For killing a foreground job which is running on terminal, we use ctrl + c

Special symbols

There are certain special symbols being used, which have special meanings, a few common ones are:

Symbol Meaning and example
$ The value of. e.g. echo $PATH
$$ Gives Process Id (PID*) of running bash shell. e.g echo $$
~ Home directory. E.g. cd ~/mlb
“” Used for strings. E.g. STR=”MLB”
- To previously visited directory. E.g. cd -

*PID: Every process is identified by a unique Id, which is called process Id or PID in short.

Customizing shell

One can also customize the shell as per our needs and requirements. For a simple example, how about we always change directory to my project directory. Therefore, whenever a terminal is opened, I do “cd myprojectpath”. There is a way we can direct the Linux shell to do certain customized things, whenever it opens the terminal.

It is through config files like .rc and profile. In case of bash shell, they are .bashrc and .profile files.

As per bash man page, .profile are for login shells whereas .bashrc are for interactive non-login shells. Well, login shells are the ones, where you either login from a remote shell, or a different console, basically you provide login name and password to access the shell. However, when you are directly logged in to a Linux machine, and open its very own terminal without any login information, it is termed as a non login shell.

Whenever a Linux shell is initiated, a set of homework is done related to config, environment which is specified through these .rc and .profile files. One can always customize these files to customize the shell.

For example, Lets customize our shell to change directory whenever the shell is initiated. This example is with respect to bash shell.

As our first task, we’ll create a directory, called WORKSPACE.


Now. open the .bashrc file to edit

gedit .bashrc

Move to the end of the file and add following line


Save and Close the file.  Its done! Lets see, how that works :

- Exit the terminal (Hint: command is ‘exit’)
- Open the terminal again.

Note, the ‘pwd’ is our newly created directory.


Instances of shell

One can open many instances of the shell which are independent of each other.

In case of Ubuntu :

  • Opening a new terminal, key combination is “CTRL + SHIFT + N”
  • Opening a new terminal tab, use “CTRL + SHIFT + T”

As in, each instance maintains its own session and that’s how it maintains its Linux shell environment. For example, a variable exported in one session cannot be visible to another session. This lets multiple users working comfortably and independently on the same machine. However, changes made on the disk are universal, which is obvious.

Virtual Consoles

A virtual console is a command line shell prompt by multiple access to the Linux Shell, but with no graphical user interface. These consoles are accessed from the system itself, and not remotely. However, they are virtual consoles accessing the same Linux Shell, and can be used simultaneously, even with separate key settings like NUMLOCK, Caps Lock, etc. They use the same machine but provides a multi user environment where multiple users can work on their own virtual console not depending upon others to leave.

The vital use of such virtual consoles comes on front when our system hangs, or some problem occurs in our console where we are not able to do anything. However, in such a scenario, changing the virtual console and debugging the problem is a big rescue.

One can experience the various virtual consoles through :

.. and so on.

These days in Linux, each virtual console are dedicated for a specific purpose like for logs and messages, for installations, etc. These assignments could vary with different flavours of Linux. However, in my case Virtual Console 7(CTRL + ALT + F7) is for graphical display. Find out for yours.


With the end to this article, take home is a basic understanding of Linux Shell, know how and usage of general commands along with conventions and interesting highlights. We also know about the virtual consoles to play around with Linux. Isn’t it interesting how a Linux Shell, a single program helps Linux users in myriads of ways? How about creating our own Linux Shell in C? Stay tuned for more!


Category: Linux administration Shell

About Rupali

Rupali Sharma holds an Honours degree in BE. She holds several years of experience in Linux software development and has worked on several programming languages like C/C++, Assembly etc. She contributes as author and content Editor at MyLinuxBook.

4 thoughts on “Introduction to Linux Shell

  1. Rupali

    Thanks jpeg and kapil, good to know about interesting new projects. Will definitely try.

  2. Nisarg Shah

    Thanks for the tutorial, was of immmense help :D


Leave a Reply

Your email address will not be published. Required fields are marked *