我的 perl 脚本如何调用和执行并后处理它

Posted

技术标签:

【中文标题】我的 perl 脚本如何调用和执行并后处理它【英文标题】:How can my perl script invoke and exe and post process it 【发布时间】:2013-05-30 12:46:04 【问题描述】:

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

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

我打算使用系统命令来完成这项工作,但我不确定是否应该分叉 shell 脚本并等待其完成。由于 shell 脚本的输出是多重的,因此不确定捕获是否有效。告诉我最好的选择

【问题讨论】:

如果您想捕获其输出,您必须从script 命令调用的shell 中执行shell 脚本。或者将 stdout 和 stderr 重定向到一个文件,而不是使用 script 【参考方案1】:

这是我最近遇到的最有趣的问题之一。

假设您有一个 shell 脚本 myscript.sh。为了让脚本运行它并捕获输出,至少在我的 SUSE linux 上,所以检查你的 script(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)?

【讨论】:

【参考方案2】:

你为什么需要使用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。大多数批处理脚本都符合这些限制。

【讨论】:

以上是关于我的 perl 脚本如何调用和执行并后处理它的主要内容,如果未能解决你的问题,请参考以下文章

从 Perl 脚本执行 .net 命令行应用程序

如何执行 perl 程序以及通过相同的 Windows 批处理文件给用户输入

从cron运行时,Perl脚本不会将STDOUT输出到文件

一个文本处理的perl脚本

从计划任务运行 perl Plackup 脚本

进入由 shell 脚本设置的 perl 程序环境变量