我的perl脚本如何调用并执行和发布它

时间:2013-05-30 12:46:05

标签: perl system capture

我需要我的脚本来做一个简单的操作:

  1. 使用unix script命令将屏幕上的活动记录到文件
  2. 执行shell脚本(此脚本输出多行到STDOUT)
  3. 停止脚本命令
  4. 分析脚本命令的输出
  5. 我打算使用system命令来完成这项工作,但我不确定是否应该分叉shell脚本并等待它完成。由于shell脚本的输出是多个,因为不确定捕获是否有效。让我知道最好的选择

2 个答案:

答案 0 :(得分:0)

这是我在一段时间内遇到的最有趣的问题之一。

假设您有一个shell脚本myscript.sh。要让脚本运行它并捕获输出,至少在我的SUSE linux上,所以检查你的脚本(1)手册页,我写道:

    script -c /path/to/myscript.sh myscript.log

所以Perl看起来很模糊:

# first, a bunch of code to initialize the program

# then run the shell script.
my $rv = system("script -c /path/to/myscript.sh myscript.log");

# then a bunch of code to process myscript.log

但我想知道你不能只是:

 system("/path/to/myscript.sh > myscript.log");

而不是涉及脚本(1)?

答案 1 :(得分:0)

为什么你需要使用script? shell脚本是否具有交互性?它需要有效的TTY吗?如果它是一个不需要有效TTY的非交互式批处理作业,那么最好将其作为管道打开并通过文件句柄处理输出。

例如:

open my $cmd_handle, "-|", $command, @args 
    or die "Could not run $command @args: $!";

foreach my $line ( <$cmd_handle> )
{
    # ... process the command output here ...
}

close $cmd_handle;

这样做的好处是Perl脚本会在发生时处理命令的输出。如果您确实需要将处理推迟到最后,您可以将所有输出粘贴到数组中,然后再处理它:

open my $cmd_handle, "-|", $command, @args 
    or die "Could not run $command @args:  $!";

my @cmd_output = ( <$cmd_handle> );
close $cmd_handle;

foreach my $line ( @cmd_output )
{
    # ... process the command output here ...
}

如果它符合我上面提到的那些限制,则应该比通过script运行命令更好:非交互式,并且不需要有效的TTY。大多数批处理脚本都符合这些限制。