0

我有一个使用以下 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;
4

1 回答 1

1

单步执行上面的代码,这一行:

foreach (readdir $d) {

读取您打开的目录中每个文件的名称到句柄“$d”,然后将每个文件依次分配给事物变量($ )。(这个变量是那些奇怪但出色的 Perl 特性之一。在大多数情况下你不必提及 $;它就在那里。)

然后在下一行:

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

“-f”和“-x”是文件测试操作符。由于两者都没有明确的参数(例如,-f "myfile.txt"),它们将使用隐含的事物变量 $_。-f 操作符只是检查某个东西是否是一个文件,而 -x 则检查该文件是否是可执行的(由设置的可执行位指示)。第三部分,/^build-(\d+)-安装程序/,检查它是否与该模式匹配。

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

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

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

有关 Unix 文件系统权限的更多信息

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

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

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

chmod u+x build-4607-installer.pl

有关 chmod 的更多信息。

我希望这会有所帮助!

于 2015-03-01T00:24:38.893 回答