2010-08-30 130 views
2

我有Perl腳本開始#!/usr/bin/perl#!/usr/bin/env perl調用Perl腳本

首先,什麼是第二個版本是什麼意思?

其次,我使用Ubuntu。所有的腳本都被設置爲可執行文件。當我嘗試通過簡單地調用腳本來運行腳本(例如./script.pl)時,我得到: No such file or directory。當我通過perl ./script.pl調用它運行良好。

爲什麼?

+0

長鏡頭的位 - 他們是你從某處下載的腳本,並且你可能在文件而不是LF中獲得了CR LF行尾。 – justintime 2010-08-30 08:52:06

+0

'哪個perl'說什麼? – 2010-08-30 09:26:53

+0

'哪個perl'說'/ usr/bin/perl'。這些是我編寫的腳本(並且仍在編寫)。我只在Ubuntu上工作。 – 2010-08-30 11:30:40

回答

3

#!/usr/bin/env perl使用標準的POSIX工具env解決「問題」是UNIX不支持家當線相對路徑(據我所知)的家當不被處理。可以使用env工具在修改環境變量後啓動程序(本例中爲perl)。在這種情況下,不會修改任何變量,然後env將搜索Perl的PATH並運行它。因此,即使Perl未安裝在/usr/bin中,但在其他某個路徑(必須位於PATH變量中)中,具有該特定shebang行的腳本也能正常工作。

然後,你的問題./script.pl不工作:你說它有可執行的位設置,就像chmod +x script.pl?但它是否也以一個shebang(#!)行開始?也就是說,前兩個字節必須是#!,並且後面必須跟一個文件路徑(到perl)。有必要告訴內核運行這個腳本的程序。如果你這樣做了,路徑是否正確?你想嘗試#!/usr/bin/env perl變種;-)

+0

腳本的第一行是'#!/ usr/bin/env perl'。我也嘗試用'#!/ usr/bin/perl'替換它(它確實存在於我的系統中),但是也沒有提供相同的錯誤信息。 – 2010-08-30 07:59:04

+0

@David B:哪些'env'和'哪個perl'說? – Dummy00001 2010-08-30 12:51:34

+0

@ Dummy00001:'$ which env' =>'/ usr/bin/env','$ which perl' =>'/ usr/bin/perl' – 2010-08-30 13:50:49

2

使用#!/usr/bin/env perl解決了每個系統上不一定在/usr/bin上的問題perl;它只是存在,使劇本更加便攜


在一個相關的說明,您的第二個問題,有一個/usr/bin/perl和/或/usr/bin/env?如果沒有,那就可以解釋爲什麼直接運行腳本不起作用;如果您運行的腳本作爲參數傳遞給perl

+2

只是爲了澄清 - 如果運行'perl腳本'它會忽略shebang行中的任何路徑,但它會查看行中的任何選項標誌。 – justintime 2010-08-30 08:45:43

+2

只是爲了澄清邊緣情況下的說明:如果運行「perl腳本」,它會忽略shebang行中的任何路徑(如果(且僅當)shebang行包含單詞「perl」時)。如果你把「#!/ bin/sh」放在裏面,perl足夠聰明,可以爲你執行sh。 – 2010-08-30 09:48:16