Bug in #! processing

Ceri Davies ceri at submonkey.net
Wed Sep 29 06:11:39 PDT 2004


On Wed, Sep 29, 2004 at 01:47:06PM +0200, S?awek ?ak wrote:
> Ceri Davies <ceri at submonkey.net> writes:
> 
> > On Tue, Sep 28, 2004 at 07:45:28PM +0200, S?awek ?ak wrote:
> >> Hi,
> >> 
> >>     It seems that there is a long standing bug in processing of command-line
> >>     options for scripts and such. Take following files:
> >> 
> 
> [...]
> 
> 
> >>     On FreeBSD 5.x:
> >>     
> >> thirst<zaks>(1790)% ./tst.sh
> >> Main.c test
> >> ./main
> >> -
> >> ./tst.sh
> >> 
> >>     On Solaris:
> >> 
> >> sb8:root> ./tst.sh
> >> Main.c test
> >> ./main
> >> -#!
> >> ./tst.sh
> >> 
> >> sb8:root> uname -a
> >> SunOS sb8 5.8 Generic_108528-21 sun4u sparc SUNW,UltraAX-i2
> >
> > [snip Tru64 and AIX]
> >
> >>     Any takers?
> >
> > It's easy enough to fix this case, but Solaris looks buggy in other
> > areas 
>     
>     You should speel buggy as 'POSIX' in this case I guess.

You're actually guessing though, right?  I can't find this in the
standard; if you know it's there then I'd appreciate a reference.

> > (I do not have any other systems to hand):
> >
> > 	FreeBSD 4.10-STABLE:
> >
> > $ cat tst.sh
> > #!./main -f -o -#!
> > print ok
> > $ ./tst.sh
> > Main.c test
> > ./main
> > -f
> > -o
> > -
> > ./tst.sh
> 
>     Well, it is consistent with FreeBSD 5.x in this respect. Discards all after
>     second #! when passing arguments to the interpretter.

Yes.

> > 	Solaris 9:
> >
> > $ ./tst.sh
> > Main.c test
> > ./main
> > -f
> > ./tst.sh
> 
>     This behavior is mandated by POSIX which, as I reckon, allows passing of
>     only the first argument to the interpreter.

Are you guessing again?

I believe that the FreeBSD behaviour is closer to "correct" than
anything else we're seeing in this thread.  I should be able to specify

	#!/usr/bin/perl -w -0

or whatever without having everything other than the first argument
ignored.

>     It is confirmed by other
>     supposedly compliant systems. I've checked before AIX 5.2, Solaris 8/9. Two
>     raisins in the pie are Tru64 5.1B and HP-UX 11, which return some erm,
>     strange results. For such script:
> 
> #!./main 1 2 3 -#!
> print ok
> 
>     You get:
> 
> Main.c test
> ./main
> 1 2 3 -#!
> ./tst.sh

Linux 2.4.20 does this too.

>     Thus it seems that the systems squeeze all arguments in one and pass it that
>     way to our handsome interpreter. Nevertheless both Tru64 and HPUX are
>     dying and we got to move on with our lives.
> 
>     The behavior I'd like to have, and which seems correct is not bothering with
>     second, 3rd and so on occurence of #! in the first line of script. Feasible?
>     I guess so. The only commercial product on my systems uses -#! switch on all
>     platforms as a script file mark.

That seems wrong too.  #! shouldn't be magic anywhere other than at the
beginning of a file.

>     I don't see any explanation for current
>     behavior therefore I'm reporting it.

The explanation is that we only process that line up to a '#' or
newline.  Backing out revision 1.21 of sys/kern/imgact_shell.c is one
fix, or perhaps allowing a '#' character to be escaped.  I'm not sure if
I see an overwhelming reason for either.

Ceri
-- 
It is not tinfoil, it is my new skin.  I am a robot.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20040929/741775af/attachment.bin


More information about the freebsd-current mailing list