bash scripting across linux and solaris

Theodore Ruegsegger gruntly-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org
Fri Aug 28 10:26:16 EDT 2009


Matt wrote, about using #!/bin/sh:
> Strictly speaking, 'bash' is a superset of 'sh'.  Some linux systems make
> 'sh' a symlink to 'bash', but not all (ubuntu IIRC is one that doesn't), and
> solaris certainly doesn't.
>
> This matters since a linux distro like fedora that just uses bash for sh
> will not enforce 'sh-only' syntax, whereas ubuntu and solaris, which use
> actual 'sh' binaries, will.

I've long thought that bash takes note of how it's invoked and, if you
invoke it as sh, it limits its behavior to the sh subset. Well, this
wouldn't be the first time something I've long thought turns out to be
wrong.

I note that in Debian, sh is a symlink to bash but under Ubuntu it's a
symlink to dash, so it is a separate binary but still not sh itself,
although the manpage for dash appears to be the plain manpage for BSD
sh, with no mention of dash.

>From reading the bash manpage (for the version supplied with Debian
and Ubuntu), I note that bash cares whether it's invoked as bash or sh
and behaves differently. In particular, calling it sh enforces
POSIX-compliance. Alas, I can't tell whether posixly-correct behavior
is the same as the sh subset.

An experiment is in order. Array support is a feature of bash not
included in sh, so let's try that.

On Ubuntu:

$ bash
$ A[2]=foo
$ echo ${A[2]}
foo
$ exit

$ sh
$ A[2]=foo
sh: A[2]=foo: not found
$ echo ${A[2]}
sh: Bad substitution
$ exit

Ok, this is what I (and Matt) would expect, since Ubuntu has a
separate binary for sh. Since Ubuntu is a Debian derivative, it hardly
seems necessary ;-), but let's try Debian anyway:

$ bash
$ A[2]=foo
$ echo ${A[2]}
foo
$ exit

$ sh
$ A[2]=foo
$ echo ${A[2]}
foo
$ exit

Yikes! sh is bash! And I use Debian for servers, where it really matters!

This is certainly valuable to know; thanks, Matt!

> >From the school of hard knocks: unless you're an expert 'sh' programmer,
> don't develop scripts that start with #!/bin/sh on fedora and the like,
> since you can't be sure they'll work on systems that actually use the shell
> you're telling it to use.

Hmm...My view has been that system (or critical application) shell
scripts should always be written in sh because we can't guarantee that
bash or csh or ksh or zsh, etc, will be on any particular platform.
This may seem overly-conservative since one can always install the
shell in question, but you can't always install a maintainer who knows
it. Sadly, as Matt's reference to "an expert 'sh' programmer" reminds
us, neither can we assume sh expertise in a maintainer. On the other
hand, we can assume that someone entrusted with such a job will have
at least a basic knowledge of sh and will tread carefully when making
changes.

All well and good, but Matt is absolutely correct in saying that this
is dangerous if you can't guarantee your sh script actually works
under sh. Fortunately, I do most of my development under Ubuntu (and
my testing under Debian, before releasing new production code to
Debian) so it looks like I lucked out. I'll need to warn all the
colleagues that I misinformed, who are now maintaining my stuff!

Thanks again, Matt!

Ted

ps. Seems dash isn't exactly sh, but much closer than bash:
http://en.wikipedia.org/wiki/Debian_Almquist_shell

tbr





More information about the Discuss mailing list