Сценарий установки в Perl не работает правильно

У меня есть программа, которая устанавливается с помощью следующего сценария 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;

1 ответ

Проходя через ваш код выше, эта строка:

foreach (readdir $d) {

читает имя каждого из файлов в каталоге, который вы открыли, для дескриптора "$d" и присваивает каждому из этих файлов по очереди переменную thing ($ ). (Эта переменная - одна из тех странных, но блестящих особенностей Perl. В большинстве случаев вам не нужно упоминать $; она просто есть.)

Тогда в следующей строке:

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

"-F" и "-x" являются операторами проверки файлов. Поскольку ни один из них не имеет явного аргумента (например, -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 может читать и писать из файла, но не выполнять. В листинге будет показан rwx, если nikk сможет выполнить файл. Следующие две группы из трех символов --- и --- показывают, что ни nikk группы, ни кто-либо еще на машине не могут читать, писать или выполнять.

Дополнительная информация о разрешениях файловой системы Unix

Отсутствие разрешения на выполнение приводит к сбою теста "-x". Есть два способа исправить это. Либо удалите -x из теста if, чтобы он выглядел так:

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

Или добавьте разрешение на выполнение в файл. Чтобы сделать это только для владельца (при условии, что ваша программа работает от имени пользователя nikk или от имени пользователя root, сделайте следующее:

chmod u + x build-4607-installer.pl

Больше информации о chmod.

Я надеюсь, что это полезно!

Другие вопросы по тегам