回答
在第一種情況下,您將啓動perl
解釋器,並要求它使用您的文件並運行它。
在第二種情況下,您要求您的shell執行您的文件。這要求文件以
#!/<path to perl>/perl
開頭,並且該文件具有設置的執行位。
最好的方法是使用最適合您的用例。
第一個程序使用在您的$PATH
中首先找到的perl
執行該程序。第二個在程序中使用shebang行。
第一個將始終運行腳本作爲
perl
代碼。
第二個只有在perl被指定在she-bang的情況下才會這樣做。否則,它將運行它作爲shell代碼或she-bang中指定的任何內容(如果沒有she-bang,它將作爲當前shell代碼運行)。第一個將被執行,即使
noexec
安裝選項已啓用。
在這種情況下,第二個將失敗。與執行位相同的東西。第一個將工作,如果
+x
沒有設置,第二個將失敗。
您確定缺少shebang是「當前shell」代碼而不是系統shell嗎?它似乎是前者,但我不確定 – DVK 2012-08-15 16:18:08
我會稍微改述其他答案。
第一種情況將運行名爲「perl」的方案 - 大概,一個Perl語言解釋器,並傳遞價值「test.pl」把它作爲第一個參數。請注意,這會做3件事情之一,這取決於「perl的」是什麼「test.pl」是:
如果用「Perl」並不爲可執行在你
$PATH
或外殼存在別名(通過運行which perl
進行檢查),您的shell將嘗試查找不存在的可執行文件,並失敗並出現perl: Command not found
錯誤。如果「perl」是您的路徑(或shell別名)中的一個可執行文件,而該文件實際上不是Perl解釋器程序,則會執行該操作。例如,在csh中試試這個:
alias perl echo which perl # Will print "perl: aliased to echo" perl test.pl # Will print "test.pl". NOT what you intended! unalias perl
這將執行你的「perl」別名,並簡單地回顯單詞「test」。pl「
如果」perl「是你的路徑中的一個可執行文件,它是一個真正的perl解釋器,它會通過」test.pl「作爲第一個參數,在這種情況下,Perl解釋器會將這個參數因爲它不是以「 - 」開始)作爲包含Perl代碼的文件的名稱來執行並嘗試讀取該文件,將其編譯爲Perl代碼並執行它
請注意,由於程序正在運行實際上是用「Perl」和「test.pl」只是讀取在一個文本文件,「test.pl」並不需要有「執行」 Unix文件權限。
第二種情況,shell將嘗試在當前目錄中找到名爲「test.pl」的文件,並且 - 如果它存在AND且可執行 - 請嘗試將其作爲程序執行。
如果該文件不存在,或者如果它的執行位未設置,外殼將失敗,錯誤「未找到命令」。
如果該文件具有設置的執行位,shell(或實際上在Unix內核中的進程加載器)將嘗試執行它。 Unix執行給定可執行文件的規則由文件的前2個字節,即「幻數」控制。
有關神奇數字如何工作的非常好的深入報道,請參閱SO上的「
How does the #! work?
」問題。在「幻數」爲「#!」的特殊情況下, (又名「shebang」),加載程序將讀取文件的第一行,並將該行的內容(不包括前兩個字節)作爲運行命令而不是給定的可執行文件;並將路徑附加到可執行文件,作爲從shebang行讀取的命令的一個參數。作爲例子:
如果「test.pl」是的
#!/bin/sh -x
第一行的文本文件,內核將執行/bin/sh -x ./test.pl
。如果「test.pl」是的
#!/usr/bin/perl
第一行的文本文件,內核將執行。如果「test.pl」是的
#!perl
第一行的文本文件,內核將執行perl ./test.pl
。如果「test.pl」是第一行
my $var = 1;
(或任何其他第一個2字節它不知道該怎麼處理)的文本文件,它將會出錯或至少在RedHat Linux)會假裝有一個暗示012bshebang,並嘗試將該文件作爲Bourne Shell腳本執行。這當然會失敗,因爲它是Perl代碼,不是shell腳本
perl的測試。PL
- 指定到你想要的最新的Perl可執行文件(如$ PATH被發現)來執行位於$ PATH中test.pl文件中的殼。
- 運行這perl的迅速看到什麼版本的Perl是默認
- 運行回聲$ PATH,看看那裏的「」 (當前目錄)是。 '。'之前的所有目錄將首先檢查test.pl文件!請使用./test.pl,以便shell僅查找當前目錄...除非您希望它在$ PATH中搜索test.pl文件。
./test.pl
- 指定到你想要的test.pl文件的外殼,在當前目錄中,由可執行文件作爲test.pl內指定運行文件在與她邦線(與#開頭行!)。
perl test.pl不會檢查$ PATH。 – DVK 2013-07-19 13:04:00
如果妳設置可執行權限的文件,然後你可以通過./或運行該文件還用perl filename.pl
- 1. 無法識別的轉義\ R通過test.pl行7
- 2. Perl使用pp時出現錯誤-o test.pl
- 3. Perl中'for'和'foreach'有什麼區別?
- 4. Perl中的'eq'和'=〜'有什麼區別?
- 5. Perl中grep和map有什麼區別?
- 6. 在Strawberry Perl中,perl \ lib和perl \ site \ lib有什麼區別?
- 7. 有什麼區別`和$(Bash中有什麼區別?
- 8. base64和MIME base 64有什麼區別?
- 9. ==和===有什麼區別?
- 10. ==和===有什麼區別?
- 11. 有什麼區別? :和||
- 12. ==和===有什麼區別?
- 13. '=='和'==='有什麼區別?
- 14. `&`和`ref`有什麼區別?
- 15. 有什麼區別:。!和:r!?
- 16. | 0和~~有什麼區別?
- 17. Appender和〜有什麼區別?
- 18. %INC和@INC有什麼區別?
- 19. 使用int [] []和int [,]有什麼區別?
- 20. Perl正則表達式中的\ 1和$ 1有什麼區別?
- 21. Perl 5中父和基有什麼區別?
- 22. 在Perl中`use base`和@ISA有什麼區別?
- 23. 在Perl中,s/^ \ s + //和s/s + $ //有什麼區別?
- 24. Perl中的open和sysopen有什麼區別?
- 25. Perl模塊autodie和Fatal有什麼區別?
- 26. Perl中的system,exec和反引號有什麼區別?
- 27. 在Perl中,「if defined $ count」和「if $ count」之間有什麼區別?
- 28. Perl中詞法和動態範圍界定有什麼區別?
- 29. 我的($ variableName)和我的$ variableName在Perl中有什麼區別?
- 30. Perl中的對象和類之間有什麼區別?
通過執行位,你的意思的權限,正確的運行? – 2012-08-15 14:19:39
@rad是的,如使用'chmod'命令設置它。 – HonkyTonk 2012-08-15 14:22:46
好的,謝謝! – 2012-08-15 15:48:32