我用Google搜索#!/usr/bin/perl
,但我找不到任何满意的答案。我知道这是一个非常基本的东西,但仍然可以解释我在Perl中#!/usr/bin/perl
的意义是什么?此外,-w
或-T
在#!/usr/bin/perl
中的含义是什么?我是Perl的新手,所以请耐心等待。
答案 0 :(得分:14)
#!通常称为“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年了。)
答案 1 :(得分: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 :(得分:3)
关于污点模式(-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.
因此,当启用“污染模式”时,必须明确告诉require语句从哪里加载库,因为在.
数组的污染模式期间删除了@INC
。 / p>
@INC
包含从中读取库文件和模块的有效路径列表。
如果启用了污染模式,您只需执行以下操作:
D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl
Done
-ID:\perlex
将在D:\perlex
中包含目录@INC
。
您可以尝试其他方式将路径添加到@INC
,这只是一个示例。
答案 3 :(得分:2)
它被称为shebang。在基于Unix的系统(OSX,Linux等)上,该行表示从命令行运行脚本时语言解释器的路径。在perl / usr / bin / perl的情况下是perl解释器的路径。如果遗漏了hashbang,* nix系统在作为可执行文件调用时将不知道如何解析脚本。它将尝试在用户碰巧运行的任何shell(可能是bash)中解释脚本并破坏脚本。
http://en.wikipedia.org/wiki/Hashbang
-W和-T是控制perl解释器操作方式的参数。它们与您直接从命令行调用perl解释器时可以调用的参数相同。