36.9. Portability Issues
It is easier to port a shell than a shell script.
This book deals specifically with Bash scripting on
a GNU/Linux system. All the same, users of sh
and ksh will find much of value here.
As it happens, many of the various
shells and scripting languages seem to be converging toward the
POSIX 1003.2 standard. Invoking
Bash with the --posix option or inserting
a set -o posix at the head of a script
causes Bash to conform very closely to this standard. Another
alternative is to use a #!/bin/sh sha-bang header in the script,
rather than #!/bin/bash.
Note that /bin/sh is a link to /bin/bash
in Linux and certain other flavors of UNIX, and a script invoked
this way disables extended Bash functionality.
Most Bash scripts will run as-is under
ksh, and vice-versa, since Chet Ramey has
been busily porting ksh features to the
latest versions of Bash.
On a commercial UNIX machine, scripts using GNU-specific
features of standard commands may not work. This has become less
of a problem in the last few years, as the GNU utilities have
pretty much displaced their proprietary
counterparts even on "big-iron" UNIX.
release of the source to many of the original UNIX
utilities has accelerated the trend.
Bash has certain features that the traditional Bourne shell lacks. Among these are:
See the Bash
F.A.Q. for a complete listing.
36.9.1. A Test Suite
Let us illustrate some of the
incompatibilities between Bash and the classic
Bourne shell. Download and install the "Heirloom
Bourne Shell" and run the following
script, first using Bash, then the classic
Example 36-23. Test Suite
# A partial Bash compatibility test suite.
# Run this on your version of Bash, or some other shell.
default_option=FAIL # Tests below will fail unless . . .
echo -n "Testing "
sleep 1; echo -n ". "
sleep 1; echo -n ". "
sleep 1; echo ". "
# Double brackets
String="Double brackets supported?"
echo -n "Double brackets test: "
if [[ "$String" = "Double brackets supported?" ]]
# Double brackets and regex matching
String="Regex matching supported?"
echo -n "Regex matching: "
if [[ "$String" =~ R.....matching* ]]
test_arr=$default_option # FAIL
Array=( If supports arrays will print PASS )
echo "Array test: $test_arr"
# Command Substitution
test_csub=$default_option # FAIL
echo "Command substitution test: $test_csub"
# Completing this script is an exercise for the reader.
# Add to the above similar tests for double parentheses,
#+ brace expansion, process substitution, etc.