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?
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?
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";
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.
Der Vollständigkeit halber: 'meine @output = qx {tar ...};' – Dummy00001
Danke. Fügte es der Antwort hinzu. – Sebastian
Versuchen Sie es mit einem Druck vor den Backticks. Sie drucken nicht die Ausgabe des Befehls. – eballes
Was ist Ihr erwartetes Verhalten? –
@ el.pescado Ich benutze diesen Befehl in osx, ich brauche nicht 'print', ich werde die Ausgabe bekommen – roger