2016-04-26 13 views
0

Ich betreibe Befehl in Perl-Skript wie folgt aus:Ubuntu Perl kann Shell-Ausgabe nicht erhalten?

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

Ich habe /tmp/js.tgz, aber ich kann die ausführliche Ausgabe nicht erhalten?

+2

Versuchen Sie es mit einem Druck vor den Backticks. Sie drucken nicht die Ausgabe des Befehls. – eballes

+0

Was ist Ihr erwartetes Verhalten? –

+0

@ el.pescado Ich benutze diesen Befehl in osx, ich brauche nicht 'print', ich werde die Ausgabe bekommen – roger

Antwort

3

Backticks(``) or qx führt einen Befehl aus und gibt die STDOUT. Also, Sie brauchen nur eine Variable, um STDOUT zu erfassen. STDERR ist unberührt.

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

print "$stdout"; 

Oder

können Sie verwenden system .Es einen Befehl ausführt und gibt seinen Exit-Status (STDOUT und STDERR unberührt sind).

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

Sie müssen ein Ziel für die Befehlsausgabe in Perl spezifizieren:

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

Alle Ausgangsleitungen in $ output landen. die Variable $ STDOUT Namensgebung ist nicht gut, weil es ein reserviertes Schlüsselwort in Perl ist.

Der Befehl wird erzeugt wahrscheinlich mehr als eine Zeile der Ausgabe. Mit open vielleicht besser:

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; 

Sie können auch STDERR erfassen

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

Diese verwendet, wird einen Fehler zu STDERR umgeleitet und Sie erhalten beide (Dateien und Fehler) auf den gleichen $fh.

IPC::Open3 konnte erfassen sowohl (STDOUT und STDERR) an verschiedene Dateihandies.

Update (dank @ Dummy00001):

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

wird jede Zeile der tar-Ausgabe als ein Array-Element zurück.

+1

Der Vollständigkeit halber: 'meine @output = qx {tar ...};' – Dummy00001

+0

Danke. Fügte es der Antwort hinzu. – Sebastian

Verwandte Themen