Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Re: Sys.argv with interpreter and compiler
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 1999-07-09 (01:10)
From: Gerd Stolpmann <Gerd.Stolpmann@d...>
Subject: Re: Sys.argv with interpreter and compiler
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:

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

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 Stolpmann      Telefon: +49 6151 997705 (privat)
Viktoriastr. 100             
64293 Darmstadt     EMail: (privat)