2016-04-26 18 views
0

私はこのようなperlのスクリプトでコマンドを実行します。ubuntu perlはシェル出力を取得できませんか?

#!/usr/bin/env perl 
`tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`; 

私は/tmp/js.tgzを得たが、私は冗長な出力を得ることができませんか?

+2

バックテックの前に印刷してみてください。コマンドの出力は表示されません。 – eballes

+0

あなたの期待される行動は何ですか? –

+0

@ el.pescado私はosxでこのコマンドを使用します。私は 'print'を必要としません。私は出力を得ます – roger

答えて

3

Backticks(``) or qxはコマンドを実行し、STDOUTを返します。だから、STDOUTをキャプチャするための変数が必要です。 STDERRはそのままです。

#!/usr/bin/env perl 
my $stdout = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`; 

print "$stdout"; 

あるいは、

あなたはsystem .ITを使用することができます(STDOUTSTDERRは変更されません)コマンドを実行し、その終了ステータスを返します。

my $exit_status = system('tar zvcf /tmp/js.tgz -C /home/cuidehe/js .'); 
print "Exit Status: $exit_status\n"; 
3

あなたはPerlの内部コマンド出力のターゲットを指定する必要があります。

my $output = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`; 
print $output; 

すべての出力行が$出力に終わります。 変数$ STDOUTの命名は、Perlで予約されているキーワードなので良くありません。

このコマンドは、複数の出力行を生成する可能性があります。 openを使用すると良いかもしれない:

open my $fh,'-|','tar zvcf /tmp/js.tgz -C /home/cuidehe/js .' 
    or die 'Error launching tar'; 
while (<$fh>) { 
    chomp; # Remove the trailing \n from the input line 
    print "Got line: $_\n"; # Do whatever you want here. 
} 
close $fh; 

あなたも同じ$fhにこれはSTDERRにエラーをリダイレクトすると、あなたが(ファイルおよびエラー)の両方を取得し

open my $fh,'-|','tar zvcf /tmp/js.tgz -C /home/cuidehe/js . 2>&1' 
    or die 'Error launching tar'; 

を使ってSTDERRを捕捉することができます。

IPC::Open3は、異なるファイルハンドルに(STDOUTとSTDERR)の両方を取り込むことができます。

更新(@ Dummy00001のおかげで):

my @output = `tar zvcf /tmp/js.tgz -C /home/cuidehe/js .`; 

は、1つのアレイ項目としてタール出力の各行を返します。

+1

完成度: 'my @output = qx {tar ...};' – Dummy00001

+0

ありがとうございました。それを答えに加えました。 – Sebastian

関連する問題