Re: Sys.argv with interpreter and compiler

From: Gerd Stolpmann (Gerd.Stolpmann@darmstadt.netsurf.de)
Date: Fri Jul 09 1999 - 01:23:34 MET DST


From: Gerd Stolpmann <Gerd.Stolpmann@darmstadt.netsurf.de>
To: Markus Mottl <mottl@miss.wu-wien.ac.at>, luther@dpt-info.u-strasbg.fr
Subject: Re: Sys.argv with interpreter and compiler
Date: Fri, 9 Jul 1999 01:23:34 +0200
Message-Id: <99070901440006.28040@schneemann>

On Mon, 05 Jul 1999, Markus Mottl wrote:
>> I don't get the same, why :
>>
>> sh-2.02$ cat essay
>> #!/usr/local/bin/ocaml
>> print_string "Hello world!"; print_newline();;
>> exit 0;;
>> ^D
>> sh-2.02$ ./essai
>> ./essai: line 2: syntax error near unexpected token `;'
>> ./essai: line 2: `print_string "Hello world!"; print_newline();;'
>
>Your toplevel "/usr/local/bin/ocaml" is obviously compiled to byte code.
>Take a look at it with "less" and you will see that the first line of
>this executable is actually "#!/home/mottl/mysys/bin/ocamlrun".

There is another way to get around this:

#!/bin/sh
# (*
exec ocaml "$0" "$@"
*) directory ".";;
print_string "Hello world!"; print_newline();;
exit(0);;

It does not matter whether "ocaml" is itself a script or not, and you
do not need to specify the interpreter with an absolute file name;
/bin/sh always exists. The solution is a bit tricky: The first lines
are interpreted by both /bin/sh and ocaml.

        # (*

The shell sees a comment line because of #. Ocaml sees the beginning of
a directive with a comment between # and the name of the directive
which is allowed.

        exec ocaml "$0" "$@"

This line is only seen by the shell, as ocaml thinnks it is a comment.
It causes that the process switches over to run ocaml with the given
parameters. The shell stops here and does not read further.

        *) directory ".";;

The end of the comment and the directive. #directory "." has no effect,
as "." is already in the search path.

>As far as I know it is not allowed on any unix system to run scripts
>whose interpreter is a script itself. This would make it much easier to
>replace this interpreter with something evil - e.g. some kind of wrapper
>that executes unfriendly commands under you UID and continues with the
>"true" interpreter.

That's what they tell you. I believe that kernel programmers do not like
recursions at all. (There are actually some serious problems with recursions
in kernel mode, for example recursive mutexes.)

Gerd

--
----------------------------------------------------------------------------
Gerd Stolpmann      Telefon: +49 6151 997705 (privat)
Viktoriastr. 100             
64293 Darmstadt     EMail:   Gerd.Stolpmann@darmstadt.netsurf.de (privat)
Germany                     
----------------------------------------------------------------------------



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:23 MET