在以下命令中,我想将输出写入文件,并在输出变量中获取STDOUT,STDERR,我该怎么做
my( $output) = `ssh login.com ls /tmp > filename 2>&1`;
print "\n=========$output============";
答案 0 :(得分:2)
捕获结果然后将Perl打印到文件中是不是更明显?
use strict;
use warnings;
use Capture::Tiny qw/capture_merged/;
open my $log, '>', 'filename';
$|++; #no buffering
my ($result, $status) = capture_merged { system 'ssh login.com ls /tmp' };
print "Result: $result";
print $log $result;
答案 1 :(得分:0)
一旦完成就抓住文件。
my ($output) = `ssh login.com ls /tmp/ > filename 2>&1;cat filename`
print "\n=========$output============";
编辑:如果保留退出代码很重要(我认为https://stackoverflow.com/a/9784064/1137055中的答案更完整,更少hacky):
`ssh login.com ls /tmp/ > filename 2>&1`; # run command and output to a file
my $code = $?;
my $output = { local $/ = undef; open FILE, "file" or die "Couldn't open file: $!"; $string = <FILE>; close FILE; } # "slurp" the file in using perl
print "\n=========$output============$code========\n";
或者更不理想的解决方案:
`ssh login.com ls /tmp/ > filename 2>&1`; # run command and output to a file
my $code = $?;
my $output = `cat filename` # read the file by shell
print "\n=========$output============$code========\n";
答案 2 :(得分:0)
您应该使用CPAN中的一个SSH :: *模块来执行此操作。或者您可以使用“tee”shell命令。
my $output = `ssh login.com ls /tmp/ 2>&1 | tee filename`