我有一个使用以下Perl脚本安装的程序。安装无法正常进行,我收到消息“找不到安装程序”。显然,什么都没做,因为脚本只是死掉了。

这是Perl安装脚本(用于安装名为Simics的程序):

#!/usr/bin/perl

use strict;
use warnings;

# Find the most recent installer in the current working directory.
my $installer;
my $highest_build = 0;
opendir my $d, "." or die $!;
foreach (readdir $d) {
    if (-f && -x && /^build-(\d+)-installer/) {
    if ($1 > $highest_build) {
        $highest_build = $1;
        $installer = $_;
    }
    }
}
closedir $d;

die "No installers found.\n" unless defined $installer;
exec "./$installer", @ARGV;

最佳答案

在上面的代码中逐步执行以下代码:

foreach (readdir $d) {


读取您在目录中打开到句柄“ $ d”的每个文件的名称,并将每个文件依次分配给Thing变量($)。 (此变量是怪异但出色的Perl特质之一。在大多数情况下,不必提到$;它就在那里。)

然后在下一行:

if (-f && -x && /^build-(\d+)-installer/) {


“ -f”和“ -x”为file test operators。由于没有人拥有明确的参数(例如-f“ myfile.txt”),因此他们将使用隐含的事物变量$ _。 -f运算符只是检查文件是否为文件,-x则检查文件是否可执行(如所设置的可执行位所示)。第三部分,/ ^ build-(\ d +)- installer /,检查是否与该模式匹配。

正如您在上面的评论中提到的,目录列表显示

-rw------- 1 nikk nikk 52238 Feb 27 20:50 build-4607-installer.pl


rw -------显示三个组(所有者(“ nikk”))和拥有文件的组(第二个“ nikk”)中每个组的文件许可权。以rw-开头的前三个字符表明nikk可以从文件中读取和写入-但不能执行。如果nikk可以执行该文件,则清单将显示rwx。接下来的两个由三个字符组成的组---和---表示,nikk组和计算机上的其他任何人都不能读取,写入或执行。

More information on Unix file system permissions

缺少执行权限导致“ -x”测试失败。有两种解决方法。从if测试中删除-x,使其看起来像这样:

if (-f && /^build-(\d+)-installer/) {


或向文件添加执行权限。要仅针对所有者执行此操作(假设您的程序以nikk用户或root用户身份运行,请执行以下操作:

chmod u + x build-4607-installer.pl

More information on chmod.

希望对您有所帮助!

10-08 04:45