我的perl脚本如何调用和exe并对其进行后期处理

我的perl脚本如何调用和exe并对其进行后期处理,perl,system,capture,Perl,System,Capture,我需要脚本来执行一个简单的操作: 使用unix脚本命令将屏幕上的活动记录到文件中 执行一个shell脚本(此脚本有多行输出到STDOUT) 停止脚本命令 分析脚本命令的输出 我计划使用system命令来完成这项工作,但我不确定是否应该分叉shell脚本并等待其完成。由于shell脚本的输出是多个,因此不确定捕获是否有效。让我知道最好的选择这是我最近遇到的最有趣的问题之一 假设您有一个shell脚本myscript.sh。要让脚本运行它并捕获输出,至少在我的SUSE linux上是这样,请检查您的

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

  • 使用unix脚本命令将屏幕上的活动记录到文件中
  • 执行一个shell脚本(此脚本有多行输出到STDOUT)
  • 停止脚本命令
  • 分析脚本命令的输出

  • 我计划使用system命令来完成这项工作,但我不确定是否应该分叉shell脚本并等待其完成。由于shell脚本的输出是多个,因此不确定捕获是否有效。让我知道最好的选择这是我最近遇到的最有趣的问题之一

    假设您有一个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)?

    为什么需要使用
    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;
    
    打开我的$cmd_句柄,“-”,$command,@args
    或“无法运行$command@args:$!”;
    foreach我的$line()
    {
    #…在此处处理命令输出。。。
    }
    关闭$cmd_句柄;
    
    这样做的好处是,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 ...
    }
    
    打开我的$cmd_句柄,“-”,$command,@args
    或“无法运行$command@args:$!”;
    我的@cmd_输出=();
    关闭$cmd_句柄;
    foreach my$行(@cmd_输出)
    {
    #…在此处处理命令输出。。。
    }
    

    如果它满足我上面给出的限制:非交互式,并且不需要有效的TTY,那么两者都应该比通过
    script
    运行命令要好。大多数批处理脚本都满足这些限制。

    如果要捕获其输出,必须从
    脚本
    命令调用的shell中执行shell脚本。或者,将stdout和stderr重定向到一个文件,而不是使用
    script