The most generic sense of the term shell means any program that users employ to type commands.
A shell hides the details of the underlying operating system and manages the technical details of the operating system kernel interface, which is the lowest-level, or "inner-most" component of most operating systems.
In Unix-like operating systems, users typically have many choices of command-line interpreters for interactive sessions.
When a user logs into the system interactively, a shell program is automatically executed for the duration of the session.
The type of shell, which may be customized for each user, is typically stored in the user's profile, for example in the local file or in a distributed configuration system such as NIS or LDAP; however, the user may execute any other available shell interactively.
On Unix systems, the shell has historically been the implementation language of system startup scripts, including the program that starts a windowing system, configures networking, and many other essential functions.
Though rudimentary by modern standards, it introduced many of the basic features common to all later Unix shells, including piping, simple control structures using if and goto, and filename wildcarding.
Though not in current use, it is still available as part of some Ancient UNIX Systems.
The "rc" suffix on some Unix configuration files (for example, ".vimrc"), is a remnant of the RUNCOM ancestry of Unix shells.
It focused on making shell programming practical, especially in large shared computing centers.
It added shell variables (precursors of environment variables, including the search path mechanism that evolved into $PATH), user-executable shell scripts, and interrupt-handling.
Control structures were extended from if/goto to if/then/else/endif, switch/breaksw/endsw, and while/end/break/continue.
As shell programming became widespread, these external commands were incorporated into the shell itself for performance.
Both shells have been used as the coding base and model for many derivative and work-alike shells with extended feature sets.
Distributed as the shell for UNIX Version 7 in 1979, it introduced the rest of the basic features considered common to all the Unix shells, including here documents, command substitution, more generic variables and more extensive builtin control structures.
The language, including the use of a reversed keyword to mark the end of a block, was influenced by ALGOL 68.
Traditionally, the Bourne shell program name is sh and its path in the Unix file system hierarchy is /bin/sh.
But a number of compatible work-alikes are also available with various improvements and additional features.
- Almquist shell (ash): written as a BSD-licensed replacement for the Bourne Shell; often used in resource-constrained environments. The sh of FreeBSD, NetBSD (and their derivatives) are based on ash that has been enhanced to be POSIX conformant.
- Bourne-Again shell (bash): written as part of the GNU Project to provide a superset of Bourne Shell functionality. This shell can be found installed and is the default interactive shell for users on most Linux systems.
- Debian Almquist shell (dash): a modern replacement for ash in Debian and Ubuntu
- KornShell (ksh): written by David Korn based on the Bourne shell sources while working at Bell Labs
- Public domain Korn shell (pdksh)
- MirBSD Korn shell (mksh): a descendant of the OpenBSD /bin/ksh and pdksh, developed as part of MirOS BSD
- Z shell (zsh): a relatively modern shell that is backward compatible with bash. It's the default shell in macOS since 10.15 Catalina.
- Busybox: a set of Unix utilities for small and embedded systems, which includes 2 shells: ash, a derivative of the Almquist shell; and hush, an independent implementation of a Bourne shell.
From a user's perspective the Bourne shell was immediately recognized when active by its characteristic default command line prompt character, the dollar sign ($).
The C shell, csh, was modeled on the C programming language, including the control structures and the expression grammar.
Although the interactive features of csh have been copied to most other shells, the language structure has not been widely copied.
Shells read configuration files in various circumstances.
These files usually contain commands for the shell and are executed when loaded; they are usually used to set important variables used to find executables, like $PATH, and others that control the behavior and appearance of the shell.
The table in this section shows the configuration files for popular shells.
|$ENV (typically ~/.kshrc)||int.||int.||int.|
- blank means a file is not read by a shell at all.
- "yes" means a file is always read by a shell upon startup.
- "login" means a file is read if the shell is a login shell.
- "n/login" means a file is read if the shell is not a login shell.
- "int." means a file is read if the shell is interactive.
Variations on the Unix shell concept that don't derive from Bourne shell or C shell include the following:
- es – A functional programming rc-compatible shell written in the mid-1990s.
- Friendly interactive shell (fish) – First released in 2005.
- PowerShell – An object-oriented shell developed originally for Windows OS and now available to macOS and Linux.
- Qshell – A shell on the IBM i operating system based on POSIX and X/Open standards.
- rc – The default shell on Plan 9 from Bell Labs and Version 10 Unix written by Tom Duff. Ports have been made to various Unix-like operating systems.
- scsh – A Scheme Shell.
- wish – A windowing shell for Tcl/Tk.
Credits to the contents of this page go to the authors of the corresponding Wikipedia page: en.wikipedia.org/wiki/Unix shell.