我有一个需要执行另一个Perl脚本的Perl脚本.第二个脚本可以直接在命令行上执行,但我需要在第一个程序中执行它.我需要传递一些参数,这些参数通常在它独立运行时传递(第一个脚本定期运行,并在一组系统条件下执行第二个脚本).
Google的初步搜索建议使用反引号或system()调用.有没有其他方法来运行它?(我猜是的,因为它是我们正在讨论的Perl:P)如果我需要从被调用的程序中捕获输出,那么首选哪种方法(如果可能的话,将输出管道输出到stdout,就像第二次一样程序被直接调用)?
(编辑:哦,现在 SO提出了一些相关问题.这个问题很接近,但与我提出的问题并不完全相同.第二个程序可能需要一个小时或更长时间才能运行(大量I/O),所以我不确定一次性调用是否适合这种情况.)
我有一个程序,它应该运行一组其他程序并收集它们的输出用于记录目的.只要输出标准输出,一切都正常.
这让我想到了两个问题:
如何在一个文件中捕获两个STDIN和STDERR另一个程序?
如果根本没有输出(或STDERR仅输出),程序将卡在线上:
while (<$input>)
Run Code Online (Sandbox Code Playgroud)我怎样才能让程序等待从不确定的运行时另一个程序输出可能的,并且仍然在继续,如果有由程序执行完毕的时间没有输出.
这是代码的那一部分
my $pid = open (my $input, '-|', "$prog $args")
or push @errors, "A failute has occurred in $prog $args";
if(not @errors){
while (<$input>){ #POSSIBLE LOCATION FOR HANG UP IF NO PRINTING IS DONE
if($input =~ /^END\n$/){
last;
}
print $fh $_;
}
}
else{
print $fh "An error has occurred with executing \"$prog $args\"";
}
Run Code Online (Sandbox Code Playgroud)
注意:$fh是我的文件处理程序,用于写入我的日志文件,@errors用于在程序中内部报告错误.
编辑:我想在经历了一个问题PROC ::可靠的途径是,它似乎对效果后有STDOUT和 …
在Perl中,我使用nohup命令启动进程.命令如下:
system("nohup myproc pe88 &");
Run Code Online (Sandbox Code Playgroud)
这工作正常,过程按预期开始.但是,我想抑制此命令的以下输出 - 这是:
Sending output to nohup.out
Run Code Online (Sandbox Code Playgroud)
我必须让这个过程将它的所有输出重定向到nohup.out,但我只是不想在运行我的Perl程序时显示它.我想改为打印我自己的用户友好消息.我尝试过一些变种,但对我来说没有任何效果.
我想从我的Perl脚本中执行外部命令,将stdout和stderr的输出放入$variable我的选择中,并将命令的退出代码放入$?变量中.
我在perlfaq8和他们的论坛中找到了解决方案,但他们并没有为我工作.奇怪的是,只要退出代码是正确的,我在任何情况下都不会获得sdterr的输出.
我在Red Hat Linux 5上使用Perl版本5.8.8.
这是我正在尝试的一个例子:
my $cmd="less";
my $out=`$cmd 2>&1`;
Run Code Online (Sandbox Code Playgroud)
要么
my $out=qx($cmd 2>&1);
Run Code Online (Sandbox Code Playgroud)
要么
open(PIPE, "$cmd 2>&1|");
Run Code Online (Sandbox Code Playgroud)
当命令成功运行时,我可以捕获stdout.
我不想使用其他捕获模块.如何捕获外部命令的完整结果?
我试图Capture::Tiny在失败时获得命令的输出,
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use Carp 'confess';
use Capture::Tiny 'capture';
sub execute {
my $cmd = shift;
my ($stdout, $stderr, $exit) = capture {
system( $cmd ); # the script dies here
};
if ($exit != 0) { # the script should die here
say "exit = $exit";
say "STDOUT = $stdout";
say "STDERR = $stderr";
confess "$cmd failed";
}
say "STDOUT = $stdout";
say "STDERR = $stderr";
say "exit code = …Run Code Online (Sandbox Code Playgroud) 可能的重复:
如何在 Perl 中同时捕获 stderr、stdout 和退出代码?
在通过管道将 STDOUT 传输到文件时捕获 STDERR 的输出
我正在使用以下代码来执行进程:
open( my $proch, "-|", $command, @arguments );
Run Code Online (Sandbox Code Playgroud)
不幸的是,我只会阅读stdout。但我也想阅读 stderr 。
Stderr 重定向会导致以下错误:
open( my $proch, "2>&1 -|", $command, @arguments );
>>> Unknown open() mode '2>&1 -|' at file.pl line 289
Run Code Online (Sandbox Code Playgroud)
如何将stderr转发到stdout?