Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 08 Feb 2003 13:00:41 -0800 (PST)
From:      =?ISO-8859-1?Q?Mikko_Ty=F6l=E4j=E4rvi?= <mbsd@pacbell.net>
To:        abc@anchorageinternet.org
Cc:        freebsd-questions <questions@freebsd.org>
Subject:   Re: #!/bin/sh & execve
Message-ID:  <20030208125353.V70415-100000@atlas.home>
In-Reply-To: <200302081544.h18FiPTu024398@en26.groggy.anc.acsalaska.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 8 Feb 2003 abc@anchorageinternet.org wrote:

> say i have 2 scripts, scriptA and scriptB.
>
> scriptA
> -------
> #!/bin/sh ./scriptB 1 2 3
>
> scriptB
> -------
> #!/bin/sh
>
> echo 0:$0
> echo 1:$1
> echo 2:$2
> echo 3:$3
>
> --
>
> $ ./scriptA
>
> $0:./scriptB
> $1:1
> $2:2
> $3:3
>
> --
>
> according to execve(2), only a single [arg] should be recognized:
>
>     #! interpreter [arg]
>
>      When an interpreter file is execve'd, the system actually execve's the
>      specified interpreter.  If the optional arg is specified, it becomes the
>      first argument to the interpreter, and the name of the originally
>      execve'd file becomes the second argument; otherwise, the name of the
>      originally execve'd file becomes the first argument.  The original argu-
>      ments are shifted over to become the subsequent arguments.  The zeroth
>      argument is set to the specified interpreter.
>
> so the argv[] array in execve() should be loaded as:
>
>     argv[0]=sh, argv[1]=scriptB, argv[2]=scriptA, and
>     argv[3...]=command line args passed to scriptA.
>
> i read many many execve() man pages, and it seems like this
> is the way things should be.  but in practice, it appears on
> many unix's, argv[] gets loaded additionally with any options
> given to a script (which is given as the "[arg]" to the interpreter)
> on the 1st line of a script.
>
> can anyone tell me if this is "proper", and why or why not?
> there doesn't seem to be consistency across unix's.
> some ignore, or give an error if more than one
> "[arg]" exists on the 1st line of a script.

The only thing I can find in IEEE Std 1003.1-2001 (aka SUSv3) is

 "If the first line of a file of shell commands starts with the
  characters "#!", the results are unspecified."

which would indicate that there is no "proper" way of doing this.  You
may also want to have a look at bin/16393; at the bottom is a list of
how some unices handle the situation.  Your best bet at trying to be
portable is to use at most one argument, no whitespace and no "#".

The PR: <http://www.freebsd.org/cgi/query-pr.cgi?pr=16393>;

  $.02,
  /Mikko


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030208125353.V70415-100000>