perl
interpreta lo shebang stesso e simula il comportamento di exec*(2)
. Penso che emuli il comportamento di Linux della divisione su tutti gli spazi bianchi invece di BSD, la prima cosa solo per gli spazi bianchi, ma non importa.In che modo Perl evita i loop dello shebang?
Proprio come una dimostrazione rapida really_python.pl
#!/usr/bin/env python
# the following line is correct Python but not correct Perl
from collections import namedtuple
print "hi"
stampe hi quando invocati come perl really_python.pl
.
Inoltre, i seguenti programmi faranno la cosa giusta indipendentemente dal fatto che siano invocati come perl program
o ./program
.
#!/usr/bin/perl
print "hi\n";
e
#!/usr/bin/env perl
print "hi\n";
Non capisco il motivo per cui il programma non è loop infinito. In uno dei casi precedenti, la riga shebang è o si risolve in un percorso assoluto all'interprete perl
. Sembra che la prossima cosa che dovrebbe accadere dopo che è perl
analizza il file, nota lo shebang e delega al percorso shebang (in questo caso stesso). perl
confronta il percorso shebang con il proprio ARGV[0]
? perl
esamina la stringa shebang e verifica se contiene "perl"
come sottostringa?
Ho provato a utilizzare un collegamento simbolico per attivare il comportamento del ciclo infinito che mi aspettavo.
$ ln -s /usr/bin/perl /tmp/p
#!/tmp/p
print "hi\n";
ma quel programma ha stampato "ciao" indipendentemente da come è stato richiamato.
Su OS X, tuttavia, ero in grado di ingannare perl
in un ciclo di shebang infinito con uno script.
Contenuto del /tmp/pscript
#!/bin/sh
perl "[email protected]"
Contenuti di script perl
#!/tmp/pscript
print "hi\n";
E questo ciclo infinito (su OS X, non hanno ancora testato su Linux).
perl
chiaramente sta andando a un sacco di problemi per gestire correttamente gli shebang in situazioni ragionevoli. Non è confuso da symlink e non è confuso dal normale materiale env
. Cosa sta facendo esattamente?
Nota: questo presuppone che l'OP abbia lanciato lo script usando 'perl/tmp/pscript'. La risposta è leggermente diversa quando lo script viene lanciato usando '/ tmp/pscript'. – ikegami