Neutron Jack has asked for the wisdom of the Perl Monks concerning the following question:

I have two scripts, alpha and beta:
alpha:
#! /tmp/beta 12345 abcde
beta:
#! /usr/bin/perl -wln print scalar reverse if $. > 1;
(The real beta is much more complex.) I hoped that alpha would print:
54321 edcba
What actually printed:
./alpha: line 2: 12345: command not found ./alpha: line 3: abcde: command not found
"man execve" says that you can't have an interpreter running an interpreter, at least on Red Hat:
execve() executes the program pointed to by filename. filename must be either a binary executable, or a script starting with a line of the form "#! interpreter [arg]". In the latter case, the interpreter must be a valid pathname for an executable which is not itself a script,
It seems that Perl was invoked with alpha as an argument, noticed that the #! line didn't mention perl, and helpfully invoked a shell to interpret alpha. Well, heck—what can I do? I want alpha to remain unchanged. Am I forced to write beta in a compiled language? I want to use Perl, of course!

Replies are listed 'Best First'.
Re: Nested #! interpreters
by chromatic (Archbishop) on Feb 21, 2004 at 20:05 UTC
    system( '/path/to/beta', '/path/to/alpha' ) == 0 or die "Cannot beta alpha: $?\n";

    If you're really paranoid, use $^X as the first argument to system.

•Re: Nested #! interpreters
by merlyn (Sage) on Feb 21, 2004 at 22:03 UTC
Re: Nested #! interpreters
by ambrus (Abbot) on Feb 21, 2004 at 20:42 UTC

    As another solution, just write a c program that execs perl /tmp/beta (and passes any command line arguments it got), and then use that as an interpreter in alpha.

Re: Nested #! interpreters
by flyingmoose (Priest) on Feb 21, 2004 at 21:49 UTC
    Isn't shell piping the proper thing to use here?