2012-06-29 149 views
7

我搜索了約#!/usr/bin/perl,但我找不到任何滿意的答案。我知道這是一個非常基本的東西,但是,仍然可以解釋一下Perl中#!/usr/bin/perl的意義是什麼?此外,-w-T表示#!/usr/bin/perl?我是Perl的新手,所以請耐心等待。#!/ usr/bin/perl中-T或-w的含義是什麼?

+2

'#!/ usr/bin/perl'被稱爲shebang行。 '-w'用於警告.'-T'用於污染模式。 – 2012-06-29 06:43:51

+4

'-w'多年來一直沒有被推薦過。從Perl 5.6.0開始,我們使用了「使用警告」,它更強大,更靈活。 –

回答

13

#!通常稱爲「shebang」,它告訴計算機如何運行腳本。您還會看到很多帶有#!/bin/sh#!/bin/bash的shell腳本。

因此,/usr/bin/perl是你的Perl解釋器,它運行並給出要執行的文件。

該行的其餘部分是Perl的選項。 "-T" is tainting(這意味着輸入被標記爲「不可信」,直到您檢查它的格式)。 「-w」開啓警告。

您可以通過運行perldoc perlrun(perldoc是Perl的文檔閱讀器,可能已安裝,可能位於其自己的軟件包中)瞭解更多信息。

對於腳本你寫我會建議開始與他們:

#!/usr/bin/perl 
use warnings; 
use strict; 

這將打開許多警告,並額外的檢查 - 在你學習特別有用(我還在學習,我一直在使用Perl超過10年了)。

+0

這是一個查詢。當我需要另一個.pl文件到#!/ usr/bin/perl -T文件時,它會引發錯誤。當我刪除-T時,它會運行。原因是什麼?謝謝。 – vijay

2

它被稱爲shebang。在基於Unix的系統上(OSX,Linux等),該行指示腳本從命令行運行時語言解釋器的路徑。在perl/usr/bin/perl的情況下是perl解釋器的路徑。如果hashbang被忽略,* nix系統在被調用爲可執行文件時不會知道如何解析腳本。它會嘗試在用戶正在運行的任何shell(可能是bash)中解釋腳本並破壞腳本。

http://en.wikipedia.org/wiki/Hashbang

的-w和-T是CONTROLL Perl解釋器的操作方式參數。它們與您在直接從命令行調用perl解釋器時可以調用的參數相同。

  • -W顯示警告(aka調試信息)。
  • -T打開污染/安全檢查。
5

-w-T都是「萬無一失」的標誌。

-w與您的代碼中的use warning語句相同,它在許多編譯器中等同於警告選項。最簡單的例子是有關使用未初始化的變量的警告:

#!/usr/bin/perl -w 
print "$A\n"; 
print "Hello, world!\n"; 

將打印:

Name "main::A" used only once: possible typo at ./perl-warnings line 3. 
Use of uninitialized value $A in concatenation (.) or string at 
./perl-warnings line 3. 

Hello, world! 

-T標誌意味着從外界傳來(作爲相對內的被計算的任何值程序)被認爲是潛在的威脅,並且不允許在系統相關操作中使用這些值,例如寫入文件,執行系統命令等(這就是爲什麼當腳本在setuid/setgid下運行時Perl會激活「污點」模式的原因。 )

「污染」模式是「執行」您仔細檢查腳本中的值。

例如,代碼:

#!/usr/bin/perl -T 
$A = shift; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

會產生一個致命錯誤(終止程序):

$ ./perl-tainted jkjk 
Insecure dependency in open while running with -T switch at 
./perl-tainted line 3. 

而這僅僅是因爲參數值從「外部」來了,是不是「雙重檢查」。 「污點」模式正在吸引你注意這一事實。當然,很容易欺騙它,例如:

#!/usr/bin/perl -T 
$A = shift; 
$A = $1 if $A =~ /(^.*$)/; 
open FILE, ">$A"; 
print "$A\n"; 
close FILE; 

在這種情況下,一切正常。你「欺騙」了「污點模式」。那麼,這個假設是,程序員的意圖是讓程序更安全,所以程序員不會只是爲了解決錯誤而採取一些安全措施。 Perl的暱稱之一是「系統管理員的粘合劑和膠帶」。系統管理員爲他自己的需要創建Perl腳本並不是不可能的,並且會以root權限運行它。想想這個腳本做一些普通用戶不允許的事情......你可能想仔細檢查那些不屬於程序本身的東西,並且你想讓Perl提醒你。

希望它有幫助。

+2

'-w'與'use warnings;'不一樣。該附註是詞彙範圍。關於「-w與使用警告相同」的 – friedo

+2

。這不完全正確。 -W打開任何地方的警告(忽略$^W或不警告),-w打開任何地方的警告,除非$^W設置爲0或不使用警告。 「使用警告」在詞彙範圍上。 – tinita

3

約污染模式(-T):
requireuse語句時污染模式被接通而改變。
加載庫/模塊的路徑不再包含路徑中的.(當前目錄)。

所以,如果你加載任何庫或模塊相對於當前工作目錄沒有明確指定路徑,你的腳本將在污點模式下破壞。

對於例如:考慮perl_taint_ex.pl

#!/usr/bin/perl -T 

require "abc.pl"; 
print "Done"; 

會失敗這樣

D:\perlex>perl perl_taint_ex.pl 
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl 
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib) 
at perl_taint_ex.pl line 3. 

所以當污染模式被打開,你必須明確地告訴需要聲明要加載自.以來的庫在污染模式期間從@INC陣列中移除。

@INC包含從中讀取庫文件和模塊的有效路徑列表。

如果污染模式被打開,您只需做到以下幾點:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl 
Done 

-ID:\perlex將包括目錄D:\perlex@INC

您可以嘗試用其他方式添加到@INC的路徑,這只是一個例子。

+0

這個解釋提供了一個很好的解釋,如果你不從命令行正確使用-T參數,而是在perl腳本的shebang行中指定它,會發生什麼。有用。 – pdwalker

相關問題