2012-08-15 70 views

回答

12

在第一種情況下,您將啓動perl解釋器,並要求它使用您的文件並運行它。

在第二種情況下,您要求您的shell執行您的文件。這要求文件以

#!/<path to perl>/perl 

開頭,並且該文件具有設置的執行位。

最好的方法是使用最適合您的用例。

+0

通過執行位,你的意思的權限,正確的運行? – 2012-08-15 14:19:39

+0

@rad是的,如使用'chmod'命令設置它。 – HonkyTonk 2012-08-15 14:22:46

+0

好的,謝謝! – 2012-08-15 15:48:32

3

第一個程序使用在您的$PATH中首先找到的perl執行該程序。第二個在程序中使用shebang行。

4
  • 第一個將始終運行腳本作爲perl代碼。
    第二個只有在perl被指定在she-bang的情況下才會這樣做。否則,它將運行它作爲shell代碼或she-bang中指定的任何內容(如果沒有she-bang,它將作爲當前shell代碼運行)。

  • 第一個將被執行,即使noexec安裝選項已啓用。
    在這種情況下,第二個將失敗。

  • 與執行位相同的東西。第一個將工作,如果+x沒有設置,第二個將失敗。

+0

您確定缺少shebang是「當前shell」代碼而不是系統shell嗎?它似乎是前者,但我不確定 – DVK 2012-08-15 16:18:08

15

我會稍微改述其他答案。

  • 第一種情況將運行名爲「perl」的方案 - 大概,一個Perl語言解釋器,並傳遞價值「test.pl」把它作爲第一個參數。請注意,這會做3件事情之一,這取決於「perl的」是什麼「test.pl」是:

    1. 如果用「Perl」並不爲可執行在你$PATH或外殼存在別名(通過運行which perl進行檢查),您的shell將嘗試查找不存在的可執行文件,並失敗並出現perl: Command not found錯誤。

    2. 如果「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「

    3. 如果」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腳本

-1

perl的測試。PL

  • 指定到你想要的最新的Perl可執行文件(如$ PATH被發現)來執行位於$ PATH中test.pl文件中的殼。
  • 運行這perl的迅速看到什麼版本的Perl是默認
  • 運行回聲$ PATH,看看那裏的「」 (當前目錄)是。 '。'之前的所有目錄將首先檢查test.pl文件!請使用./test.pl,以便shell僅查找當前目錄...除非您希望它在$ PATH中搜索test.pl文件。

./test.pl

  • 指定到你想要的test.pl文件的外殼,在當前目錄中,由可執行文件作爲test.pl內指定運行文件在與她邦線(與#開頭行!)。
+0

perl test.pl不會檢查$ PATH。 – DVK 2013-07-19 13:04:00

0

如果妳設置可執行權限的文件,然後你可以通過./或運行該文件還用perl filename.pl