2016-07-17 3 views
1

Может ли кто-нибудь объяснить мне, что делает следующее? Какова цель этого куска кода?Понимание кода chunk perl

#!/bin/perl 
eval 'exec perl5 -S $0 ${1+"[email protected]"}' 
    if 0; 

Спасибо большое!

EDIT1: Я пытаюсь изменить блок кода выше в:

#!/bin/sh 
eval 'exec perl5 -S $0 ${1+"[email protected]"}' 
    if 0; 

, и я думаю, что он должен работать, потому что сценарий рассматривается как сценарий оболочки и eval получить казнены и perl5 вызывается для используйте perl для выполнения того же скрипта. Однако, когда я на самом деле запустить это, я получил:

/bin/sh: -S: invalid option

Может кто-нибудь объяснить, почему в этом случае сценарий не удалось. Я что-то неправильно понимаю? Я использую ksh

Спасибо большое!

EDIT2: EDIT1 кажется совершенно отдельный вопрос, и я отправляю его here

+3

Просто ищите эту фразу, которая дает множество хитов, среди которых [Что такое точное значение find2perl perl shebang + eval?] (Http://stackoverflow.com/questions/ 6123971/что-это-The-точным означая-оф-find2perl жемчужно-притон-Eval). И это должно ответить на ваш вопрос. –

+0

@SteffenUllrich Спасибо за ссылку! – zack

+0

Этот код исходил из 'find2perl'? – Borodin

ответ

1

Это подвох, чтобы получить файл сценария для запуска либо должным образом, под Perl, или, если он представлен непосредственно в оболочки

заявление абсолютно ничего не делает по Perl из-за if 0 в конце

Однако, если он выполняется с помощью ш или Баша того продолжение строки будет проигнорирована, и оболочка будет делать eval, и запустить тот же файл через perl5

Идея состоит в том, что, хотя Perl считает строки новой строки просто лишними пробелами, оболочка видит их в качестве терминаторов операторов. Это означает, что Perl будет игнорировать eval (до тех пор, как он компилирует), потому что остальные заявления говорит if 0, в то время как оболочка будет выполнять его и exec на новый процесс

Я не могу сказать, что я вижу в этом смысла, потому что правильная линия shebang позволит вам запускать foo.pl прямо из командной строки, но мы здесь. Люди любят хаки, потому что это заставляет их чувствовать себя умными.

+0

Спасибо за ответ. Теперь я понимаю интуицию за этим куском кода: в принципе я могу либо запускать '' perl foo'', либо '' foo'' непосредственно в оболочке. Но не могли бы вы подробнее рассказать о «из-за« если 0 в конце »и« линии продолжения »? Я действительно новичок в Perl. Большое спасибо за помощь! – zack

+0

Я нашел http://stackoverflow.com/questions/6123971/what-is-the-exact-meaning-of-the-find2perl-perl-shebang-eval и http://unix.stackexchange.com/questions/68484/what-does-1-mean-in-a-shell-script-and-how-does-it-different-from имеет смысл больше всего для меня. Спасибо за ответ. – zack

+0

@Jerry: Идея состоит в том, что, хотя Perl считает, что новые строки являются просто более пустыми, оболочка видит их в качестве терминаторов операторов. Это означает, что Perl проигнорирует 'eval', потому что в остальной части выражения говорится« if 0 », в то время как оболочка выполнит его и« exec »для всего нового процесса. Я не могу сказать, что вижу это, потому что правильная строка shebang позволит вам запускать 'foo.pl' непосредственно из командной строки, но мы здесь. Люди любят хаки, потому что это заставляет их чувствовать себя умными. – Borodin

Смежные вопросы