2015-05-05 131 views
-2

運行時,我有一個Perl腳本Info.perl它開始像這樣Perl的「使用:命令未找到」從bash腳本

#!/usr/bin/perl 
#!/usr/bin/bash 

use List::Util qw(min max); 
use List::MoreUtils qw{ all any }; 
use Cwd; 
use Data::Dumper qw(Dumper); 
use Env qw(INFODIR CONFDIR PROCDIR); 

當我從終端運行它,它給了沒有問題,按預期工作。

但後來我有一個bash腳本run.sh,只有在它

./Info.pl 

當我運行該腳本,我得到以下錯誤

./Info.pl: line 4: syntax error near unexpected token `(' 
./Info.pl: line 4: `use List::Util qw(min max);' 

如果我省略第4行我得到的以下消息:

./Info.pl: line 5: use: command not found 
./Info.pl: line 6: use: command not found 
./Info.pl: line 7: syntax error near unexpected token `(' 
./Info.pl: line 7: `use Data::Dumper qw(Dumper);' 

是否有任何特殊的方式需要運行Perl scr ipt裏面的bash腳本?或者使用use命令的特殊方式?

+6

你實際上在你的perl腳本中有2個shebang行嗎? –

+6

聽起來像你的文件正在作爲bash腳本執行,而不是Perl腳本。 – Wormbo

+0

你如何從終端上運行它? Info.pl文件集是可執行文件嗎? –

回答

2

正如在評論中所說的,你的腳本出於某種原因正在通過shell執行。你可以研究它爲什麼如此並解決它。

或者你可以解決使用下面的技巧:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl "$0" "[email protected]"' 
    if 0; # not running under some shell 

print "Args: @ARGV\n"; 

如果這個腳本通過Perl的評估,if 0;線防止EVAL從執行。

但是,shell沒有後綴條件,所以它只執行第一行,它運行正確的解釋器。

實際上,perl腳本的數字,不,NUMBER開始。谷歌這個「不在某些外殼下運行」的例子(和SO上的explanation)。

+1

標準Perl發行版安裝程序會在安裝它時將它添加到腳本中 – ikegami

+0

@ikegami嗯,這是它的來源。你在 – Dallaylaen

+0

這也記錄在[perlrun](http://perldoc.perl.org/perlrun.html)。 – ikegami

0

刪除'#!/ usr/bin/bash'會是一個好主意,因爲它是多餘的。 在腳本中調用'/ usr/bin/perl Info.pl'可能會解決此問題。

+0

謝謝,這工作起來了(起初我很困惑,因爲我在命令中加入了''' –