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>