我观察到有两种执行perl程序的方法:
perl test.pl
Run Code Online (Sandbox Code Playgroud)
和
./test.pl
Run Code Online (Sandbox Code Playgroud)
这两者之间的确切区别是什么,推荐哪一个?
DVK*_*DVK 15
我将稍微改述其他答案.
第一种情况将运行名为"perl"的程序 - 可能是Perl语言解释器,并将值"test.pl"作为第一个参数传递给它.请注意,这将执行以下三种操作之一,具体取决于"perl"是什么以及"test.pl"是什么:
如果"perl"不存在于您$PATH或shell别名中的可执行文件(通过运行检查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
Run Code Online (Sandbox Code Playgroud)
这将执行你的"perl"别名,并简单地回显单词"test.pl"
如果"perl"是您的路径中的可执行文件,它是一个真正的perl解释器,它将把"test.pl"作为第一个参数传递给它.在这种情况下,Perl解释器会将此参数(因为它不与开始" - ")作为包含Perl代码执行并试图读取该文件,编译成Perl代码并执行一个文件名.
请注意,由于正在运行的程序实际上是"perl"而"test.pl"只是一个正在读入的文本文件,因此"test.pl"不需要具有"执行"Unix文件权限.
第二种情况,shell将尝试在当前目录中找到名为"test.pl"的文件,并且 - 如果存在且可执行 - 尝试将其作为程序执行.
如果文件不存在或者如果未设置其上的执行位,则shell将失败并显示"command not found"错误.
如果文件设置了执行位,那么shell(或Unix内核中的实际进程加载器)将尝试执行它.Unix执行给定可执行文件的规则由文件的前2个字节控制,即"幻数".
有关魔术数字如何工作的非常好的深入报道,请参阅How does the #! work?SO上的问题.
在特殊情况下,"幻数"是"#!" (又名"shebang"),加载器将读取文件的第一行,并将该行的内容(无前两个字节)视为运行命令而不是给定的可执行文件; 并将可执行文件的路径作为从shebang行读取的命令的一个附加参数追加.例如:
如果"test.pl"是第一行的文本文件#!/bin/sh -x,则内核将执行/bin/sh -x ./test.pl.
如果"test.pl"是第一行的文本文件#!/usr/bin/perl,则内核将执行/usr/bin/perl ./test.pl.
如果"test.pl"是第一行的文本文件#!perl,则内核将执行perl ./test.pl.
如果"test.pl"是一个文本文件,其第一行my $var = 1;(或任何其他前两个字节,它不知道该怎么做),它将错误输出或(至少在RedHat Linux上)将假装在那里是一个隐含的#!/bin/shshebang并尝试将文件作为Bourne Shell脚本执行.当然会失败,因为它是Perl代码,而不是shell脚本
Hon*_*onk 12
在第一种情况下,您将启动perl解释器并要求它使用您的文件并运行它.
在第二种情况下,您要求shell执行您的文件.这要求文件以
#!/<path to perl>/perl
Run Code Online (Sandbox Code Playgroud)
并且该文件具有执行位设置.
最好的使用方法是最适合您使用的方法.
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |