perl
interpretuje samego Shebang i naśladuje zachowanie exec*(2)
. Wydaje mi się, że emuluje zachowanie Linuxa dzielenia na wszystkie białe znaki zamiast na pierwszą białą, ale nieważne.W jaki sposób Perl unika pętli shebang?
Podobnie jak szybki demonstracji really_python.pl
#!/usr/bin/env python
# the following line is correct Python but not correct Perl
from collections import namedtuple
print "hi"
drukuje hi Wywołany jako perl really_python.pl
.
Ponadto następujące programy postąpią właściwie, niezależnie od tego, czy są wywoływane jako perl program
lub ./program
.
#!/usr/bin/perl
print "hi\n";
i
#!/usr/bin/env perl
print "hi\n";
Nie rozumiem, dlaczego program nie jest nieskończone zapętlenie. W każdym z powyższych przypadków linia półksiężyca jest równa lub ustala bezwzględną ścieżkę do interpretera perl
. Wygląda na to, że następną rzeczą, która powinna się stać, jest to, że perl
analizuje plik, zauważa shebang i deleguje na ścieżkę shebang (w tym przypadku samą w sobie). Czy perl
porównać ścieżkę shebang do własnej ARGV[0]
? Czy perl
przyjrzeć się ciągowi shebang i sprawdzić, czy zawiera on podciąg "perl"
?
Próbowałem użyć dowiązania symbolicznego do wyzwolenia nieskończonej pętli, której oczekiwałem.
$ ln -s /usr/bin/perl /tmp/p
#!/tmp/p
print "hi\n";
ale ten program wydrukował "cześć" bez względu na to, jak został wywołany.
Jednak na OS X udało mi się oszukać perl
w nieskończoną pętlę shebang ze skryptem.
Zawartość /tmp/pscript
#!/bin/sh
perl "[email protected]"
treści skryptu perla
#!/tmp/pscript
print "hi\n";
i to robi nieskończonej pętli (na OS X, nie testowałem go jeszcze w systemie Linux).
perl
z pewnością zadałby dużo trudu, by poprawnie poradzić sobie z bzdurami w uzasadnionych sytuacjach. Nie jest to mylone przez dowiązanie symboliczne i nie jest mylone ze zwykłymi rzeczami z env
. Co dokładnie robi?
Uwaga: Zakłada się, że OP uruchomił skrypt za pomocą 'perl/tmp/pscript'. Odpowiedź jest nieco inna, gdy skrypt jest uruchamiany za pomocą '/ tmp/pscript'. – ikegami