我搜索了約#!/usr/bin/perl
,但我找不到任何滿意的答案。我知道這是一個非常基本的東西,但是,仍然可以解釋一下Perl中#!/usr/bin/perl
的意義是什麼?此外,-w
或-T
表示#!/usr/bin/perl
?我是Perl的新手,所以請耐心等待。#!/ usr/bin/perl中-T或-w的含義是什麼?
回答
#!通常稱爲「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年了)。
這是一個查詢。當我需要另一個.pl文件到#!/ usr/bin/perl -T文件時,它會引發錯誤。當我刪除-T時,它會運行。原因是什麼?謝謝。 – vijay
它被稱爲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打開污染/安全檢查。
-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提醒你。
希望它有幫助。
約污染模式(-T):
require
和use
語句時污染模式被接通而改變。
加載庫/模塊的路徑不再包含路徑中的.
(當前目錄)。
所以,如果你加載任何庫或模塊相對於當前工作目錄沒有明確指定路徑,你的腳本將在污點模式下破壞。
對於例如:考慮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
的路徑,這只是一個例子。
這個解釋提供了一個很好的解釋,如果你不從命令行正確使用-T參數,而是在perl腳本的shebang行中指定它,會發生什麼。有用。 – pdwalker
- 1. 「x(y)= z(w)」在C++中的含義是什麼?
- 2. 函數中參數x,y,z,w的含義是什麼cudaCreateChannelDesc
- 3. 「.hidden」在輸出objdump -t中的含義是什麼意思?
- 4. 公式元素中t =「shared」的含義是什麼?
- 5. x86-64 AT&T程序集中地址的含義是什麼?
- 6. T-SQL語句中前綴N的含義是什麼?
- 7. 「js 2f \ n \ t」中f的含義是什麼?
- 8. 擴展方法中「T」(TArg0,TEnum,TInt)的含義是什麼?
- 9. 什麼是<T>(尖括號)在Java中的含義?
- 10. 拇指2指令後綴W的含義是什麼?
- 11. 什麼是key123包含的或在JavaScript函數中的含義
- 12. C++模板中模板<typename T,T *>的含義是什麼?
- 13. 「T」在「git status」中的含義是什麼? (這是不是在手冊頁)
- 14. yyyy' - 'MM' - 'dd'T'HH':'mm':'ss - 'T'在這裏的含義是什麼?
- 15. DTMobileIS的含義是什麼?
- 16. if(';')的含義是什麼?
- 17. ui.draggable.draggable的含義是什麼?
- 18. URL的含義是什麼
- 19. android:backgroundDimAmount的含義是什麼?
- 20. 什麼是java.io.tmp的含義
- 21. !int_variable--?的含義是什麼!
- 22. 什麼是WindowsIdentity的含義
- 23. CronJobs的含義是什麼?
- 24. 「error_subcode」的含義是什麼
- 25. xmlns:android的含義是什麼?
- 26. $ @的含義是什麼?
- 27. SootMethod.getSubSignature()的含義是什麼?
- 28. view.bounds.origin的含義是什麼?
- 29. 「UseTaskFriendlySynchronizationContext」的含義是什麼?
- 30. DFA的含義是什麼?
'#!/ usr/bin/perl'被稱爲shebang行。 '-w'用於警告.'-T'用於污染模式。 – 2012-06-29 06:43:51
'-w'多年來一直沒有被推薦過。從Perl 5.6.0開始,我們使用了「使用警告」,它更強大,更靈活。 –