2017-08-29 3 views
1

Ich versuche zu verstehen, wie perl mit der Shebang-Linie befasst.Wie geht Perl mit der Shebang-Linie um?

I verwendet zu denken, dass jeder Interpreter, der in der "Befehlsposition" in der Befehlszeile erwähnt wird, Vorrang vor einem in der Shebang-Zeile erwähnten hat. wenn ein ausführbares Skript zum Beispiel genannt demo wie diese

#!/usr/local/bin/perl-5.00503 

printf "$]\n"; 

sieht ... dann würde ich folgendes beachten:

$ ./demo 
5.00503 
% /usr/local/bin/perl-5.22 ./demo 
5.022003 

IOW, in der ersten Ausführung, der Dolmetscher in der shebang das ist eine läuft, während in der zweiten die in der Befehlszeile erwähnte ist. So weit, ist es gut.

Aber jetzt, wenn ich die „Dolmetscher“ auf dem shebang zu so etwas wie /usr/bin/wc ändern, dann schlägt es immer jede perl Interpreter ich auf der Kommandozeile erwähnen:

% cat demo-wc 
#!/usr/bin/wc 

printf "$]\n"; 

% ./demo-wc       # produces the expected behavior 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.22 ./demo-wc 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.14 ./demo-wc 
     4  3  31 ./demo-wc 

AFAICT, dieses besondere Verhalten scheint begrenzt zu sein perl Dolmetscher; Nicht perl Dolmetscher, wie /bin/bash, nicht „außer Kraft setzen“, um die shebang:

% /bin/bash ./demo-wc 
$] 

Unterm Strich ist, dass perl die shebang radikal andere Politik zu haben scheint, erwähnte auf dem Dolmetscher je nach Handhabung.


  1. Wie perl bestimmen, welche Politik zu folgen?
  2. Was genau sind die Richtlinien in beiden Fällen?
+1

beantwortet Schon hier: https://stackoverflow.com/a/29563961/152948 – hobbs

+1

@hobbs Nicht ganz, dass ein Teil der Frage beantwortet. – zdim

Antwort

6

Es gibt ein paar verschiedene Fälle in Ihren Tests.

Wenn Sie ./demo... verwenden der Kernel die #! in der magischen Zahl findet (erste 16 Bit) und das Programm läuft, oder übergibt die Leitung an der Schale, wenn es scheitert, das beginnt, was es ist.

Wenn Sie jedoch ein Perl in der Befehlszeile aufrufen, wird diese Binärdatei von der Shell gestartet und dann verarbeitet der Perl-Interpreter selbst den Shebang. In diesem Fall verwirft es den Perl-Teil, berücksichtigt aber die Schalter –, wenn die Zeile "perl" enthält.

Wenn der Shebang nicht ruft perl, haben wir Verhalten speziell für Perl. Von perlrun

Wenn die #! Linie nicht das Wort „perl“ enthält noch das Wort „Development“, das Programm benannt nach den #! anstelle des Perl-Interpreter ausgeführt. Dies ist etwas bizarr, aber es hilft Menschen auf Maschinen, die nicht tun, #!, weil sie ein Programm sagen können, dass ihre Shell /usr/bin/perl ist, und Perl wird dann das Programm an den richtigen Interpreter für sie versenden .

1

Im Gegensatz zu den meisten anderen Interpretern macht Perl seine eigene Verarbeitung der #! Zeile. Dies ermöglicht es, mehrere Optionsargumente zu verwenden, obwohl der #!-Handler des Kernels nur eine einzige Zeichenfolge übergeben wird.

Details sind in der perlrun man-Seite. Der für Sie relevante Teil ist dies:

Wenn die "#!" Zeile enthält nicht das Wort "perl" noch das Wort "indir" das Programm nach dem "#!" wird anstelle des Perl-Interpreters ausgeführt. Das ist etwas bizarr, aber es hilft Leuten auf Maschinen, die nicht "#!" Machen, weil sie einem Programm sagen können, dass ihre SHELL/usr/bin/perl ist, und Perl wird dann das Programm an den richtigen Interpreter schicken Sie.

Verwandte Themen