1521

When writing shell programs, we often use /bin/sh and /bin/bash. I usually use bash, but I don't know what's the difference between them.

What's main difference between bash and sh?

What do we need to be aware of when programming in bash and sh?

Jianxin Gao
  • 2,047
  • 2
  • 13
  • 30
Weiwei Yang
  • 15,361
  • 3
  • 13
  • 10
  • 22
    For a useful list of bashisms and corresponding code that works on Bourne shell, see http://mywiki.wooledge.org/Bashism – StackExchange saddens dancek Apr 20 '11 at 04:14
  • 9
    as a general rule, all sh scripts will run under bash thanks to it's posix compatibility, but not all bash scripts can run under sh, the main differences you notice are things like [[ ]] instead of [ ] comparisons which allow unquoted spaces, $(( )) instead of $[ ] arithmetic expressions, and other things like "its too big and too slow" directly from the bash docs.. But new scripters need not limit themselves to sh-compatible scripts unless they are shooting for some backward compatibility, which more often than not is not the case these days, after all it is (or was...) the year 2014 right?? – osirisgothra Mar 12 '14 at 14:03
  • 1
    You may want to see the [POSIX](https://en.wikipedia.org/wiki/POSIX) standard for sh and its command language: * *[sh](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html)* * *[Shell Command Language](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html)* – Maurício C Antunes Jul 23 '13 at 03:01

12 Answers12

1317

What is sh

sh (or the Shell Command Language) is a programming language described by the POSIX standard. It has many implementations (ksh88, dash, ...). bash can also be considered an implementation of sh (see below).

Because sh is a specification, not an implementation, /bin/sh is a symlink (or a hard link) to an actual implementation on most POSIX systems.

What is bash

bash started as an sh-compatible implementation (although it predates the POSIX standard by a few years), but as time passed it has acquired many extensions. Many of these extensions may change the behavior of valid POSIX shell scripts, so by itself bash is not a valid POSIX shell. Rather, it is a dialect of the POSIX shell language.

bash supports a --posix switch, which makes it more POSIX-compliant. It also tries to mimic POSIX if invoked as sh.

sh = bash?

For a long time, /bin/sh used to point to /bin/bash on most GNU/Linux systems. As a result, it had almost become safe to ignore the difference between the two. But that started to change recently.

Some popular examples of systems where /bin/sh does not point to /bin/bash (and on some of which /bin/bash may not even exist) are:

  1. Modern Debian and Ubuntu systems, which symlink sh to dash by default;
  2. Busybox, which is usually run during the Linux system boot time as part of initramfs. It uses the ash shell implementation.
  3. BSDs, and in general any non-Linux systems. OpenBSD uses pdksh, a descendant of the Korn shell. FreeBSD's sh is a descendant of the original UNIX Bourne shell. Solaris has its own sh which for a long time was not POSIX-compliant; a free implementation is available from the Heirloom project.

How can you find out what /bin/sh points to on your system?

The complication is that /bin/sh could be a symbolic link or a hard link. If it's a symbolic link, a portable way to resolve it is:

% file -h /bin/sh
/bin/sh: symbolic link to bash

If it's a hard link, try

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

In fact, the -L flag covers both symlinks and hardlinks, but the disadvantage of this method is that it is not portable — POSIX does not require find to support the -samefile option, although both GNU find and FreeBSD find support it.

Shebang line

Ultimately, it's up to you to decide which one to use, by writing the «shebang» line as the very first line of the script.

E.g.

#!/bin/sh

will use sh (and whatever that happens to point to),

#!/bin/bash

will use /bin/bash if it's available (and fail with an error message if it's not). Of course, you can also specify another implementation, e.g.

#!/bin/dash

Which one to use

For my own scripts, I prefer sh for the following reasons:

  • it is standardized
  • it is much simpler and easier to learn
  • it is portable across POSIX systems — even if they happen not to have bash, they are required to have sh

There are advantages to using bash as well. Its features make programming more convenient and similar to programming in other modern programming languages. These include things like scoped local variables and arrays. Plain sh is a very minimalistic programming language.

Roman Cheplyaka
  • 35,061
  • 6
  • 68
  • 115
  • 2
    If you run a script with `bash` the display way more useful error messages in the case of syntax error. You can simply save time by using bash. – PHPst Apr 07 '20 at 22:48
  • What does the `%` mean at the beginning of your command lines? – joharr Apr 16 '20 at 06:33
  • 2
    @JosephHarriott it's a prompt: a character printed by the shell itself after which your command follows. Some shells use `$` instead of `%`, or `#` for the root shell. – Roman Cheplyaka Apr 17 '20 at 07:09
  • @RomanCheplyaka which shells ? I've only ever seen `$` and `#`... – joharr Apr 17 '20 at 07:39
  • @RomanCheplyaka I am certain `sh` existed well before bash (which stands for bourne-again shell). But it was very primitive and didn't respond to terminal events, like `ESC` characters. Then `ksh` came (also before bash), then bash started by those who loved the idea of a better shell, but hated ksh. :-) – raminr May 21 '20 at 18:17
  • 1
    @JosephHarriott - `%` is commonly the prompt for _user_ shells of the C Shell variety (e.g. csh, tcsh). `#` has been traditionally reserved as the prompt character for _superuser_ (root) shells, regardless of which one is chosen. But that's all in the realm of common / typical usage, as historically / traditionally observed. You can use what you like and/or what your users will tolerate. :) [Google on how](https://www.google.com/search?q=customize-unix-shell-prompt) – RichieD Aug 12 '20 at 00:28
  • where is tldr;? – Yohanes AI Sep 10 '20 at 07:18
  • You say you prefer `sh `. What is the documentation for sh? Everything I find is with BASH? So what a mess. Also, what is the problem if in a script that I have bash `#!/bin/bash ` I do `sh script_with_bash.sh `, I see the same thing happens. – jcarlosweb Mar 17 '21 at 18:40
168

sh: http://man.cx/sh
bash: http://man.cx/bash

TL;DR: bash is a superset of sh with a more elegant syntax and more functionality. It is safe to use a bash shebang line in almost all cases as it's quite ubiquitous on modern platforms.

NB: in some environments, sh is bash. Check sh --version.

haccks
  • 97,141
  • 23
  • 153
  • 244
Rein Henrichs
  • 14,632
  • 1
  • 42
  • 51
  • 32
    if bash is invoked as sh, it behaves a bit differently. See http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("Invoked with name sh") and http://www.gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode. For example, no process substitution. – glenn jackman Apr 20 '11 at 04:12
  • 12
    As bash is a superset of sh and some OS like FreeBSD do not have bash installed by default, scripting in sh will give greater portability. – user674062 Apr 20 '11 at 05:49
  • 1
    As there is no portable scriptable way to get a POSIX shell for a specific script, portable scripts cannot assume more than Bourne Shell features. – schily Sep 12 '15 at 21:34
118

This question has frequently been nominated as a canonical for people who try to use sh and are surprised that it's not behaving the same as bash. Here's a quick rundown of common misunderstandings and pitfalls.

First off, you should understand what to expect.

  • If you run your script with sh scriptname, or run it with scriptname and have #!/bin/sh in the shebang line, you should expect POSIX sh behavior.
  • If you run your script with bash scriptname, or run it with scriptname and have #!/bin/bash (or the local equivalent) in the shebang line, you should expect Bash behavior.

Having a correct shebang and running the script by typing just the script name (possibly with a relative or full path) is generally the preferred solution. In addition to a correct shebang, this requires the script file to have execute permission (chmod a+x scriptname).

So, how do they actually differ?

The Bash Reference manual has a section which attempts to enumerate the differences but some common sources of confusion include

  • [[ is not available in sh (only [ which is more clunky and limited). See also Difference between single and double square brackets in Bash
  • sh does not have arrays.
  • Some Bash keywords like local, source, function, shopt, let, declare, and select are not portable to sh. (Some sh implementations support e.g. local.)
  • Bash has many C-style syntax extensions like the three-argument for((i=0;i<=3;i++)) loop, += increment assignment, etc. The $'string\nwith\tC\aescapes' feature is tentatively accepted for POSIX (meaning it works in Bash now, but will not yet be supported by sh on systems which only adhere to the current POSIX specification, and likely will not for some time to come).
  • Bash supports <<<'here strings'.
  • Bash has *.{png,jpg} and {0..12} brace expansion.
  • ~ refers to $HOME only in Bash (and more generally ~username to the home directory of username).This is in POSIX, but may be missing from some pre-POSIX /bin/sh implementations.
  • Bash has process substitution with <(cmd) and >(cmd).
  • Bash has Csh-style convenience redirection aliases like &| for 2>&1 | and &> for > ... 2>&1
  • Bash supports coprocesses with <> redirection.
  • Bash features a rich set of expanded non-standard parameter expansions such as ${substring:1:2}, ${variable/pattern/replacement}, case conversion, etc.
  • Bash has significantly extended facilities for shell arithmetic (though still no floating-point support). There is an obsolescent legacy $[expression] syntax which however should be replaced with POSIX arithmetic $((expression)) syntax. (Some legacy pre-POSIX sh implementations may not support that, though.)
  • Several built-in commands have options which are not portable, like type -a, printf -v, and the perennial echo -e.
  • Magic variables like $RANDOM, $SECONDS, $PIPESTATUS[@] and $FUNCNAME are Bash extensions.
  • Syntactic differences like export variable=value and [ "x" == "y" ] which are not portable (export variable should be separate from variable assignment, and portable string comparison in [ ... ] uses a single equals sign).
  • Many, many Bash-only extensions to enable or disable optional behavior and expose internal state of the shell.
  • Many, many convenience features for interactive use which however do not affect script behavior.

Remember, this is an abridged listing. Refer to the reference manual for the full scoop, and http://mywiki.wooledge.org/Bashism for many good workarounds; and/or try http://shellcheck.net/ which warns for many Bash-only features.

A common error is to have a #!/bin/bash shebang line, but then nevertheless using sh scriptname to actually run the script. This basically disables any Bash-only functionality, so you get syntax errors e.g. for trying to use arrays. (The shebang line is syntactically a comment, so it is simply ignored in this scenario.)

Unfortunately, Bash will not warn when you try to use these constructs when it is invoked as sh. It doesn't completely disable all Bash-only functionality, either, so running Bash by invoking it as sh is not a good way to check if your script is properly portable to ash/dash/POSIX sh or variants like Heirloom sh

tripleee
  • 139,311
  • 24
  • 207
  • 268
  • 2
    Fundamentally, the TL;DR ersion is [And's answer](http://stackoverflow.com/a/30294230/874188). – tripleee Mar 08 '17 at 08:47
  • 4
    [shellcheck.net](https://www.shellcheck.net) was all I needed. many thanks. – Josh Habdas Jul 30 '18 at 10:33
  • 1
    FWIW, `export variable=value` is mandated by POSIX: https://pubs.opengroup.org/onlinepubs/009695399/utilities/export.html. Perhaps it's not available in some ancient shells, but it's definitely not a bashism. – Roman Cheplyaka Apr 17 '20 at 07:15
72

Shell is an interface between a user and OS to access to an operating system's services. It can be either GUI or CLI (Command Line interface).

sh (Bourne shell) is a shell command-line interpreter, for Unix/Unix-like operating systems. It provides some built-in commands. In scripting language we denote interpreter as #!/bin/sh. It was one most widely supported by other shells like bash (free/open), kash (not free).

Bash (Bourne again shell) is a shell replacement for the Bourne shell. Bash is superset of sh. Bash supports sh. POSIX is a set of standards defining how POSIX-compliant systems should work. Bash is not actually a POSIX compliant shell. In a scripting language we denote the interpreter as #!/bin/bash.

Analogy:

  • Shell is like an interface or specifications or API.
  • sh is a class which implements the Shell interface.
  • Bash is a subclass of the sh.

enter image description here

Premraj
  • 56,385
  • 22
  • 212
  • 157
  • 6
    I don't get it. You've mentioned both "Bash is superset of sh" and "Bash is a subclass of the sh", aren't they contrary statements? Can you please clarify? – Keerthana Prabhakaran Apr 26 '18 at 06:13
  • 21
    I think this is trying to say Bash inherits from `sh` (so it's a "subclass" in the OOP sense) and extends it (so has a superset of the functionality). – tripleee May 19 '18 at 04:44
65

Post from UNIX.COM

Shell features

This table below lists most features that I think would make you choose one shell over another. It is not intended to be a definitive list and does not include every single possible feature for every single possible shell. A feature is only considered to be in a shell if in the version that comes with the operating system, or if it is available as compiled directly from the standard distribution. In particular the C shell specified below is that available on SUNOS 4.*, a considerable number of vendors now ship either tcsh or their own enhanced C shell instead (they don't always make it obvious that they are shipping tcsh.

Code:

                                     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 readline 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.
Chaminda Bandara
  • 1,635
  • 2
  • 23
  • 29
SriniV
  • 10,123
  • 14
  • 53
  • 81
  • Your table is not useful to me as it tries to compare features of the Bourne Shell and features from ksh from before 1988. If you really make a table for 1988, you would need to remove most of the other shells from that table - including bash, sh and rc. Could you explain where did yo get the values for your table from? – schily Sep 12 '15 at 20:43
  • 1
    Let me give some hints: Job Control was added to the Bourne Shell in 1989 and the Bourne Shell was made OpenSource in 2005. The Korn shell has process substitution since at least 1988 and it is OpenSource since 1997. BTW: your statements regarding $ENV are not correct, $ENV is only read/executed for interactive shells. – schily Sep 12 '15 at 20:47
  • 3
    @schily This post has been captured from http://www.cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html – SriniV Sep 14 '15 at 05:35
  • @schily If you feel it is incorrect anywhere, please feel free to edit it appropriately. – SriniV Sep 14 '15 at 05:36
  • Thank you for the pointer! The problem with the table is that it is biased, because it has notice (1) at all but does not use it e.g. for bash. I am sure that we would need to use it for many features of bash but it is not possible anymore to find a reliable source for such a change. Note that the oldest Bourne Shell source is still available, but the oldest bash source I am able to find is for bash-1.14.7 from 1996 Another problem is that the table contains many lines that refer to features I cannot associate with a property, e.g. `Mh Mailbox completion`or `Sun keyboard hack`. – schily Sep 14 '15 at 07:53
  • So how to deal with such "features"? Also note that shortly after the Bourne Shell was made OpenSource, I started to enhance the Bourne Shell and since 2006, there is e.g. a version with the history editor I designed/prototyped in 1982 and implemented in 1984 for my "bsh" (not Bourne Shell related). BTW: David Korn also started with the Bourne Shell source around 198/1984. – schily Sep 14 '15 at 08:03
  • 8
    Based on what schily exposed it would seem that it would be better to remove this answer, as it is essentially fraudulent, and OP didn't really vet the information he pasted. – danno Oct 17 '15 at 00:12
  • [zsh](http://www.slideshare.net/jaguardesignstudio/why-zsh-is-cooler-than-your-shell-16194692) beats [all](https://en.wikipedia.org/wiki/Comparison_of_command_shells). – Cees Timmerman Oct 13 '16 at 12:15
  • http://serverfault.com/a/98772/98333 highlights some of the issues with `zsh`. Bash at least *tries* to be POSIX if you ask nicely. – tripleee Feb 07 '17 at 09:54
28

TERMINAL

  • program(s) that put a window up
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm, and eterm.

SHELL

  • Is a program that runs in the terminal
  • Shell is both a command interpreter and a programming language
  • Shell is simply a macro processor that executes commands.
  • Macro processor means functionality where text and symbols are expanded to create larger expressions.

SH Vs. BASH

SH

  • (SHell)
  • Is a specific shell
  • a command interpreter and a programming language
  • Predecessor of BASH

BASH

  • (Bourne-Again SHell)
  • Is a specific shell
  • a command interpreter and a programming language
  • Has sh functionality and more
  • Successor of SH
  • BASH is the default SHELL

REFERENCE MATERIAL:

SHELL gnu.org:

At its base, a shell is simply a macro processor that executes commands. The term macro processor means functionality where text and symbols are expanded to create larger expressions.

A Unix shell is both a command interpreter and a programming language. As a command interpreter, the shell provides the user interface to the rich set of GNU utilities. The programming language features allow these utilities to be combined. Files containing commands can be created, and become commands themselves. These new commands have the same status as system commands in directories such as /bin, allowing users or groups to establish custom environments to automate their common tasks.

Shells may be used interactively or non-interactively. In interactive mode, they accept input typed from the keyboard. When executing non-interactively, shells execute commands read from a file.

A shell allows execution of GNU commands, both synchronously and asynchronously. The shell waits for synchronous commands to complete before accepting more input; asynchronous commands continue to execute in parallel with the shell while it reads and executes additional commands. The redirection constructs permit fine-grained control of the input and output of those commands. Moreover, the shell allows control over the contents of commands’ environments.

Shells also provide a small set of built-in commands (builtins) implementing functionality impossible or inconvenient to obtain via separate utilities. For example, cd, break, continue, and exec cannot be implemented outside of the shell because they directly manipulate the shell itself. The history, getopts, kill, or pwd builtins, among others, could be implemented in separate utilities, but they are more convenient to use as builtin commands. All of the shell builtins are described in subsequent sections.

While executing commands is essential, most of the power (and complexity) of shells is due to their embedded programming languages. Like any high-level language, the shell provides variables, flow control constructs, quoting, and functions.

Shells offer features geared specifically for interactive use rather than to augment the programming language. These interactive features include job control, command line editing, command history and aliases. Each of these features is described in this manual.

BASH gnu.org:

Bash is the shell, or command language interpreter, for the GNU operating system. The name is an acronym for the ‘Bourne-Again SHell’, a pun on Stephen Bourne, the author of the direct ancestor of the current Unix shell sh, which appeared in the Seventh Edition Bell Labs Research version of Unix.

Bash is largely compatible with sh and incorporates useful features from the Korn shell ksh and the C shell csh. It is intended to be a conformant implementation of the IEEE POSIX Shell and Tools portion of the IEEE POSIX specification (IEEE Standard 1003.1). It offers functional improvements over sh for both interactive and programming use.

While the GNU operating system provides other shells, including a version of csh, Bash is the default shell. Like other GNU software, Bash is quite portable. It currently runs on nearly every version of Unix and a few other operating systems - independently-supported ports exist for MS-DOS, OS/2, and Windows platforms.

Timothy L.J. Stewart
  • 1,054
  • 13
  • 12
16

Other answers generally pointed out the difference between Bash and a POSIX shell standard. However, when writing portable shell scripts and being used to Bash syntax, a list of typical bashisms and corresponding pure POSIX solutions is very handy. Such list has been compiled when Ubuntu switched from Bash to Dash as default system shell and can be found here: https://wiki.ubuntu.com/DashAsBinSh

Moreover, there is a great tool called checkbashisms that checks for bashisms in your script and comes handy when you want to make sure that your script is portable.

Andrzej Pronobis
  • 27,984
  • 15
  • 65
  • 83
11

bash and sh are two different shells. Basically bash is sh, with more features and better syntax. Most commands work the same, but they are different.Bash (bash) is one of many available (yet the most commonly used) Unix shells. Bash stands for "Bourne Again SHell",and is a replacement/improvement of the original Bourne shell (sh).

Shell scripting is scripting in any shell, whereas Bash scripting is scripting specifically for Bash. In practice, however, "shell script" and "bash script" are often used interchangeably, unless the shell in question is not Bash.

Having said that, you should realize /bin/sh on most systems will be a symbolic link and will not invoke sh. In Ubuntu /bin/sh used to link to bash, typical behavior on Linux distributions, but now has changed to linking to another shell called dash. I would use bash, as that is pretty much the standard (or at least most common, from my experience). In fact, problems arise when a bash script will use #!/bin/sh because the script-maker assumes the link is to bash when it doesn't have to be.

Gopika BG
  • 852
  • 6
  • 11
9

They're nearly identical but bash has more featuressh is (more or less) an older subset of bash.

sh often means the original Bourne shell, which predates bash (Bourne *again* shell), and was created in 1977. But, in practice, it may be better to think of it as a highly-cross-compatible shell compliant with the POSIX standard from 1992.

Scripts that start with #!/bin/sh or use the sh shell usually do so for backwards compatibility. Any unix/linux OS will have an sh shell. On Ubuntu sh often invokes dash and on MacOS it's a special POSIX version of bash. These shells may be preferred for standard-compliant behavior, speed or backwards compatibility.

bash is newer than the original sh, adds more features, and seeks to be backwards compatible with sh. In theory, sh programs should run in bash. bash is available on nearly all linux/unix machines and usually used by default – with the notable exception of MacOS defaulting to zsh as of Catalina (10.15). FreeBSD, by default, does not come with bash installed.

Ryan Taylor
  • 9,463
  • 2
  • 34
  • 31
  • `sh` far predates POSIX. These days, you would hope that any `sh` you find is at least POSIX-compatible; but on legacy systems this is by no means a given. POSIX stadardizes far more than the shell; in fact, you could argue that the standardization of operating system calls and library functions is more important. – tripleee Dec 18 '19 at 15:04
  • I removed the stuff about POSIX to make it less confusing – Ryan Taylor Dec 18 '19 at 20:02
4

/bin/sh may or may not invoke the same program as /bin/bash.

sh supports at least the features required by POSIX (assuming a correct implementation). It may support extensions as well.

bash, the "Bourne Again Shell", implements the features required for sh plus bash-specific extensions. The full set of extensions is too long to describe here, and it varies with new releases. The differences are documented in the bash manual. Type info bash and read the "Bash Features" section (section 6 in the current version), or read the current documentation online.

Keith Thompson
  • 230,326
  • 38
  • 368
  • 578
  • `sh` only gives you a POSIX shell, if you have the right `PATH` set up in your current shell. There is no defined PATH-name that gives you a POSIX shell. – schily Sep 12 '15 at 21:37
  • For a long time, `sh` was not necessarily *even* giving you a POSIX shell, on Solaris, for example. – tripleee Apr 14 '16 at 04:19
1

The Differences in as easy as much possible: After having a basic understanding, the other comments posted above will be easier to catch.

Shell - "Shell" is a program, which facilitates the interaction between the user and the operating system (kernel). There are many shell implementation available, like sh, bash, csh, zsh...etc.

Using any of the Shell programs, we will be able to execute commands that are supported by that shell program.

Bash - It derived from Bourne-again Shell. Using this program, we will be able to execute all the commands specified by Shell. Also, we will be able to execute some commands that are specifically added to this program. Bash has backward compatibility with sh.

Sh - It derived from Bourne Shell. "sh" supports all the commands specified in the shell. Means, Using this program, we will be able to execute all the commands specified by Shell.

For more information, do: - https://man.cx/sh - https://man.cx/bash

Raihanhbh
  • 35
  • 8
  • To understand POSIX, read the response from [Alex](https://stackoverflow.com/users/95810/alex-martelli) Please check: https://stackoverflow.com/a/1780614/1261003 – Raihanhbh Apr 16 '20 at 10:21
  • I'm not trying to understand POSIX. I'm reviewing your Answer and as such I need to see it your Answer adds value. I do not think it does. – Scratte Apr 16 '20 at 10:23
  • I believe these small clarifications would help a novice to understand the jargon used in the above discussions more comfortably. @Scratte – Raihanhbh Apr 16 '20 at 10:25
-1

Linux operating system offers different types of shell. Though shells have many commands in common, each type has unique features. Let’s study different kind of mostly used shells.

Sh shell:

Sh shell is also known as Bourne Shell. Sh shell is the first shell developed for Unix computers by Stephen Bourne at AT&T's Bell Labs in 1977. It include many scripting tools.

Bash shell :

Bash shell stands for Bourne Again Shell. Bash shell is the default shell in most linux distribution and substitute for Sh Shell (Sh shell will also run in the Bash shell) . Bash Shell can execute the vast majority of Sh shell scripts without modification and provide commands line editing feature also.

rashedcs
  • 2,709
  • 2
  • 29
  • 32
  • There was an earlier shell by Ken Thompson. The Bourne shell was officially introduced in v7 Unix (1979). – tripleee Dec 18 '19 at 15:26