【问题标题】:Installation script in Perl not functioning correctlyPerl 中的安装脚本无法正常运行
【发布时间】:2015-04-30 20:44:50
【问题描述】:

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

【问题讨论】:

  • 脚本希望在您的当前目录中找到一个名为build-###-installer(其中### 是某个数字)的程序。你有这样的文件吗?
  • @Barmar:是的,有。该文件是 build-4607-installer.pl。我想知道为什么脚本没有看到它?我不懂 Pearl 脚本语言。
  • 可执行吗?文件测试在定义$installer 之前需要-x
  • 我刚刚在我的 Linux 机器上复制了你上面的大部分代码,它工作正常。让我相信,就像上面的 G. Cito 一样,这一定是安装程序烫发的问题。请发布ls -al build-4607-installer.pl 的输出,以便我们查看文件上的权限...
  • 谢谢。输出为-rw------- 1 nikk nikk 52238 Feb 27 20:50 build-4607-installer.pl

标签: linux perl scripting installation simics


【解决方案1】:

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

foreach (readdir $d) {

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

然后在下一行:

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

“-f”和“-x”是file test operators。由于两者都没有明确的参数(例如,-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 组和机器上的其他任何人都不能读取、写入或执行。

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.

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2016-02-06
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多