GOTCHA in Ubuntu - broken shell

Tom Buskey tom at buskey.name
Mon Oct 1 10:30:53 EDT 2007


On 10/1/07, Ben Scott <dragonhawk at gmail.com> wrote:
>
> On 10/1/07, Tom Buskey <tom at buskey.name> wrote:
> > Scripting non-bourne shell stuff with #!/bin/sh at the top *should*
> break.
>
>   Ah, yes, maximum pain as a design goal.  :-(


What I'm saying is #!/bin/sh should run like #!/bin/sh.  export VAR=value
doesn't work in bourne shell.  So if you put that in a bourne shell script
with #!/bin/sh, then it should fail.  If you want it to succeed, use a shell
that accepts that syntax, such as #!/bin/bash or #!/bin/ksh.

I've seen scripts that start w/o #!/bin/sh by people with a default csh.
They run ok in their environment, but someone running bash breaks them.
They're coding csh so #!/bin/csh should be at the top.  It'd expect csh
scripts to fail if #!/bin/sh was at the top because sh runs bourne shell.


> If you want bash or ksh, use #!/bin/bash or #!/bin/ksh.
>
>   What about an extension feature that exists in more than one
> implementation, but is not part of POSIX?

  What about the "range of acceptable implementations" problem of the
> POSIX standard that Fran Fadden pointed out?


I don't think I can address this so I won't.

> If it doesn't exist in /bin, put it there where it belongs.
>
>   So now shell scripts are totally unportable.


No, #!/bin/sh is bourne shell.  /bin/bash is bash.  If you need your bash
script to work on, say SunOS or Solaris 7, install /bin/bash so it will
work.  So maybe bash scripts are not portable, but they never really were.
Maybe they are on linux where #!/bin/bash always exists.

Look at perl.  Nowadays it is on most systems.  It used to have to be
added.  It was in /bin, /usr/local/bin, /opt/sfw/bin.  When you go on a new
system, you can't ensure that all the modules your script needs are
installed so you have to add them.  Maybe you're on Solaris 8 with perl
5.0003 and perl 5.8 was installed in /usr/local/bin with all the modules.


> I've been shell scripting for awhile on multiple OSen.
>
>   Yah, and it sucks.  Linux should aim to succeed where other *nixes
> fail, and not suck.


I agree too.  I don't think making /bin/sh run bashism would be any
different from linking /bin/sh to /bin/csh.

My point is that expecting #!/bin/sh to act like bash or ksh or csh is
wrong.  It's like expecting grape juice to taste like wine.


  I don't want a sequel to the Unix Wars.


Who does?  Thank goodness environments have converged a bit.  /bin/perl,
/bin/bash exist in Solaris, Linux, Cygwin, xBSD and (I think) MacOSX.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.gnhlug.org/mailman/private/gnhlug-discuss/attachments/20071001/c3172224/attachment-0001.html 


More information about the gnhlug-discuss mailing list