Perl-скрипт не выполняет некоторые внешние вызовы - PullRequest
1 голос
/ 14 сентября 2011

Я написал этот Perl-скрипт для автоматизации моих беспроводных соединений:

#!/usr/bin/perl

use strict;

my @modes = ("start", "stop");
my $mode = $modes[0];
my $kill_command = "sudo kill -TERM ";

sub check_args
{
    if($#ARGV != 0)
    {
        print(STDERR "Wrong arguments\n");
        print(STDERR "Usage: ./wicd.pl start|stop\n");
        exit();
    }

    my @aux = grep(/^$ARGV[0]$/, @modes);

    if (!@aux)
    {
        print(STDERR "Unknown argument\n");
        print(STDERR "Usage: ./wicd.pl start|stop\n");
        exit();
    }

    $mode = $ARGV[0];
}

check_args();

my @is_wicd_running = `ps -A | grep wicd`;

# START
if ($mode eq $modes[0])
{
    if (!@is_wicd_running)
    {
        system("gksudo ifconfig wlan0 down");
        system("sudo macchanger -r wlan0");
        system("sudo wicd");
    }

    my @is_wicd_gui_running = grep(/wicd-client/, @is_wicd_running);

    if (!@is_wicd_gui_running)
    {
        system("gksudo wicd-gtk &");
    }
}

# STOP
else
{
    for (@is_wicd_running)
    {
        my @aux = split(/ /, $_);
        system("$kill_command$aux[1]");
    }
    system("sudo ifconfig wlan0 down");
}

Проблема в том, что macchanger и sudo ifconfig wlan0 down не выполняются (только те ...). Странно то, что эти вызовы выполняются при вызове скрипта через отладчик Perl (perl -d). Я подумал, что это может быть проблемой синхронизации, и добавил несколько вызовов sleep () перед этими вызовами, но без изменений. Я также пробовал с вызовами system () без изменений.

РЕДАКТИРОВАТЬ: более странно, я обнаружил, что если я запускаю скрипт как perl wicd.pl , он работает правильно, в то время как . / Wicd.pl не работает (он работает но имеет проблему, описанную выше). Я приложил весь сценарий. Интерпретатор Perl, используемый в заголовке, такой же, как , который возвращает команда perl .

Есть какие-нибудь подсказки? Заранее спасибо!

1 Ответ

0 голосов
/ 14 сентября 2011

Может помочь дополнительная информация, а также убедиться, что \ n всегда заканчивает строку вывода. Попробуйте свои бегущие команды в пределах

sub runx
{
   foreach my $cmd ( @_ ) 
   {
      my $out = qx("$cmd 2>&1");
      my $x = $?;
      $out =~ s/\s*$/\n/s;
      printf "\%s (0x\%0x):\n\%s", $cmd, $x, $out;
      last if $x; 
   }
 return $x;
}

Нет времени запускать этот код сегодня утром и не могу удалить свой предыдущий комментарий. Но кое-что, выполнив команду "which", также может гарантировать, что ваша команда находится в PATH.

...