Perl脚本不执行某些外部调用

时间:2011-09-14 09:42:56

标签: linux perl wifi

我编写了这个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 :(得分:-1)

更多信息可能有所帮助,同时确保\ 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上。