理解perl

时间:2016-07-17 12:19:47

标签: perl

任何人都可以向我解释以下是什么尝试吗?这个代码块背后的目的是什么?

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

非常感谢!

EDIT1:我正在尝试将上面的代码块更改为:

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

并且我认为它应该可以工作,因为脚本被视为shell脚本并且eval被执行并且perl5被调用以使用perl来执行相同的脚本。但是,当我实际运行时,我得到了:

/bin/sh: -S: invalid option

任何人都可以解释为什么这种情况下脚本失败了。我误解了什么吗?我正在使用ksh

非常感谢!

EDIT2: EDIT1似乎是一个完全独立的问题,我发布了here

1 个答案:

答案 0 :(得分:1)

这是一个肮脏的技巧,可以在perl下正确运行脚本文件,或者直接提交给shell

由于最后的if 0

,声明在perl下绝对没有任何意义

但是,如果它由sh或bash执行,那么将忽略延续行,shell将执行eval,并通过perl5运行相同的文件

这个想法是,虽然Perl认为换行符只是更多的空格,但shell将它们视为语句终止符。这意味着Perl将忽略eval(只要它编译),因为语句的其余部分说if 0,而shell将执行它并exec到一个全新的进程

我不能说我明白了这一点,因为正确的shebang线允许你直接从命令行运行foo.pl,但我们确实如此。人们喜欢黑客,因为这让他们觉得很聪明