如何在perl脚本的无限循环中运行用户提供的命令,直到用户中止它?

时间:2011-09-14 18:19:23

标签: perl scripting

我需要运行一个命令,直到我测试的系统失败,或者我中止脚本。我需要运行的命令可能会有所不同,所以我将它作为引号中的命令行参数。但我似乎无法使用system命令运行命令行参数。这是我到目前为止所尝试的内容(使用@Cfreak提供的脚本编辑我的尝试,即使我看到相同的问题):

#!/usr/bin/perl


while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
        print "System call $ARGV[1] failed with code $retval\n";
    }
    $count++;
}

如果我这样做     ./run ls

我看到以下照片:

System call  failed with code 65280
Iteration #: 1
System call  failed with code 65280
Iteration #: 2

我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

你的system参数附近有单引号。你根本不需要引号(虽然双引号可行)

你真的应该检查系统调用的返回值。如果调用成功,它应该返回0:

while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
         print "System call $ARGV[1] failed with code $retval\n";
    }
    $count++;
}

如果要在代码失败时停止脚本,请使用last

while(1)
{
    print "Iteration #: $count\n";
    $retval = system ($ARGV[1]);
    if( $retval != 0 ) {
         print "System call $ARGV[1] failed with code $retval\n";
         last; # will break out of the loop
    }
    $count++;
}

答案 1 :(得分:3)

我相信你想要$ ARGV [0]而不是$ ARGV [1]。您可能还需要检查以确保$ ARGV [0]存在。

if( 0 > $#ARGV )
{
  print "No command\n";
}
else
{
  while(1)
  {
    print "$count\n";
    my $ret = system( "ARGV[0]" );
    if( 0 != $ret )
    {
      print "<$ARGV[0] failed with $ret\n";
      exit;
    }
    $count++;
  }
}

答案 2 :(得分:2)

65280 == 0xFF00,所以命令确实运行(0xFF00!= -1),它没有死于信号(0xFF00&amp; 0x7F == 0),退出时退出代码为255(0xFF00&gt;&gt; ; 8 == 0xFF == 255)。

所以我想你应该先检查你运行的命令。那么,根据你自己的输出,空字符串!也许您想要$ARGV[0]而不是$ARGV[1]

使用use strict; use warnings; !!!它可以避免这整个问题。