Next: Here-Documents, Up: Portable Shell
There are several families of shells, most prominently the Bourne family and the C shell family which are deeply incompatible. If you want to write portable shell scripts, avoid members of the C shell family. The the Shell difference FAQ includes a small history of Unix shells, and a comparison between several of them.
Below we describe some of the members of the Bourne shell family.
To be compatible with Ash 0.2:
foo=
false
$foo
echo "Don't use it: $?"
cat ${FOO=`bar`}
BASH_VERSION is set. To disable its extensions and require
POSIX compatibility, run `set -o posix'. See Bash POSIX Mode, for details.
ZSH_VERSION is set. By default zsh is not
compatible with the Bourne shell: you have to run `emulate sh' and
set NULLCMD to `:'. See Compatibility, for details.
Zsh 3.0.8 is the native /bin/sh on Mac OS X 10.0.3.
The following discussion between Russ Allbery and Robert Lipe is worth reading:
Russ Allbery:
The GNU assumption that /bin/sh is the one and only shell leads to a permanent deadlock. Vendors don't want to break users' existing shell scripts, and there are some corner cases in the Bourne shell that are not completely compatible with a POSIX shell. Thus, vendors who have taken this route will never (OK...“never say never”) replace the Bourne shell (as /bin/sh) with a POSIX shell.
Robert Lipe:
This is exactly the problem. While most (at least most System V's) do have a Bourne shell that accepts shell functions most vendor /bin/sh programs are not the POSIX shell.So while most modern systems do have a shell somewhere that meets the POSIX standard, the challenge is to find it.