任何人都可以向我解释以下是什么尝试吗?这个代码块背后的目的是什么?
#!/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
答案 0 :(得分:1)
这是一个肮脏的技巧,可以在perl下正确运行脚本文件,或者直接提交给shell
由于最后的if 0
但是,如果它由sh或bash执行,那么将忽略延续行,shell将执行eval
,并通过perl5
运行相同的文件
这个想法是,虽然Perl认为换行符只是更多的空格,但shell将它们视为语句终止符。这意味着Perl将忽略eval
(只要它编译),因为语句的其余部分说if 0
,而shell将执行它并exec
到一个全新的进程
我不能说我明白了这一点,因为正确的shebang线允许你直接从命令行运行foo.pl
,但我们确实如此。人们喜欢黑客,因为这让他们觉得很聪明