Сценарий установки в 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
Я надеюсь, что это полезно!