2012-02-04 11 views

Odpowiedz

8

Niektóre systemy nie rozpoznają wiersza #!/usr/bin/perl na początku skryptów, więc próba wywołania programu Perl po nazwie w takim systemie spowoduje przekazanie skryptu do powłoki. Aby temu zaradzić, przenośne programy Perla zaczynają się od linii, która po interpretacji przez standardową powłokę POSIX powoduje, że skrypt zostanie przekazany do perl(1). if 0 powoduje, że linia jest ignorowana, gdy jest uruchamiana przez Perla, a umieszczenie jej w osobnej linii powoduje, że powłoki traktują ją jako oddzielne polecenie, uruchamiając tylko eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}' zaraz po odczytaniu.

+0

Dzięki, bardzo! Jak sprytnie naprawdę! –

+1

Zastanawiam się, czy są jeszcze jakieś systemy, o które warto się martwić, nie obsługują [shebangs] (http://en.wikipedia.org/wiki/Shebang_ (Unix)). –

+2

Mam skrypty, które robią to, aby działały pod Solaris AND Linux. Shebang wskazuje na perl Solaris, ale pod Linuksem skrypt wykonuje się jako shell, a linia eval wykonuje perl Linux. Perls są instalowane w nieparzystych lokalizacjach, ale pliki/katalogi są dzielone między systemami za pośrednictwem NFS. – runrig

2

Wiersz działa pod muszelkami i perl. W perlu eval jest pomijany z powodu następującego po if 0. W powłoce ten sam plik jest wykonywany w perl przy użyciu eval.

+0

Tak, to też jest dobre wyjaśnienie. Dzięki jeszcze raz! –