我需要我的脚本来做一个简单的操作:
- 使用 unix script 命令将屏幕上的活动记录到文件中
- 执行一个shell脚本(这个脚本有多行输出到STDOUT)
- 停止脚本命令
- 分析脚本命令的输出
我打算使用系统命令来完成这项工作,但我不确定是否应该分叉 shell 脚本并等待其完成。由于 shell 脚本的输出是多重的,因此不确定捕获是否有效。让我知道最好的选择
这是我一段时间以来遇到的最有趣的问题之一。
假设您有一个 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)?
为什么你需要使用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。大多数批处理脚本都满足这些限制。