Я написал этот 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 .
Есть какие-нибудь подсказки? Заранее спасибо!