tar-archive
Pedro thomi
- perl
Hallo,
ich versuche schon seit ein paar Stunden aus meinem CGI/Perl-Script einen UNIX-Befehl aufzurufen (tar) aber es will einfach nicht klappen...
Also, ich habe ein Teil meiner Web-Seite so programmiert, dass sie den Inhalt meiner Festplatte als html ausdruckt. Es funktioniert alles perfekt, bis auf diesen Befehl. Damit wollte ich erreichen dass ich den ganzen Inhalt eines Verzichnisses als ein kurz davor kreirten tar-archive runterladen kann. So muss ich nicht jede einzelne Datei einzeln runterladen (muehsam)...
So sieht es aus:
$command = "tar -cvf '/Volumes/Mac OS X/WebServer/Documents/Verzeichnis.tar' '/Volumes/Mac OS X/Verzeichnis'"
qx($command);
Funktioniert (hier) nicht... Wenn ich den Inhalt von $command 1 zu 1 auf ein terminal Fenster schreibe klappts aber.
Mit system() habe ich es auch versucht.
Irgendjemand eine schlaue Idee?
Danke schoen,
Pedro Thomi.
Hi,
$command = "tar -cvf '/Volumes/Mac OS X/WebServer/Documents/Verzeichnis.tar' '/Volumes/Mac OS X/Verzeichnis'"
qx($command);
welche Fehlermeldung steht in "$!"?
Viele Grüße
Michael
Hallo,
$command = "tar -cvf '/Volumes/Mac OS X/WebServer/Documents/Verzeichnis.tar' '/Volumes/Mac OS X/Verzeichnis'"
qx($command);
welche Fehlermeldung steht in "$!"?
Unwahrscheinlich, dass da eine steht. Die wird ja von Perl
gesetzt, der Fehler allerdings ist woanders. Vielleicht sollte
er eher Backticks benutzen:
print $command 2>&1
;
Mal ganz abgesehen davon, dass es genau dafuer 'Archive::Tar'
und 'Compress::Zlib' gibt :)
Gruesse,
CK
hi!
qx($command);
Vielleicht sollte er eher Backticks benutzen:$command 2>&1
;
Wo soll da der Unterschied sein? `` und qx{} haben genau die gleiche
Funktion (siehe perldoc perlop).
bye, Frank!
Hi Frank,
qx($command);
Vielleicht sollte er eher Backticks benutzen:$command 2>&1
;
Wo soll da der Unterschied sein? `` und qx{}
haben genau die gleiche Funktion
... was in diesem Falle um so mysteriöser erscheinen
läßt, daß erst ein Operator verwendet wird, der im
Gegensatz zu "system()" eine Ausgabe in eine Variable
umlenken würde, diese Ausgabe dann aber von diesem
Perl-Skript gar nicht verwendet wird ...
Viele Grüße
Michael
Hi, danke fuer die vielen Antworten!
... was in diesem Falle um so mysteriöser erscheinen
läßt, daß erst ein Operator verwendet wird, der im
Gegensatz zu "system()" eine Ausgabe in eine Variable
umlenken würde, diese Ausgabe dann aber von diesem
Perl-Skript gar nicht verwendet wird ...
Es ist ja so dass es _keine_ Ausgabe gibt. Oder Anders, die Ausgabe die ich krieg ist entweder 1 oder 0, hat nicht funktioniert oder hat funktioniert... und das brauche ich einfach nicht... :-)
Ich habe die Variable aber trotzdem Ausdrucken lassen, und lustigerweise kommt eine 0 raus. Das bedeutet, dem tar-manual nach, dass keine Fehler aufgetreten sind. Verstehe ich nicht...
Troztdem vielen dank an Allen fuer die Hilfe,
Pedro Thomi.
Hallo Christian,
welche Fehlermeldung steht in "$!"?
Unwahrscheinlich, dass da eine steht.
in der Tat.
Wie kommt man denn nun am elegantesten an eine solche
Fehlermeldung (und ggf. den return code des ausge-
führten Kommandos, das würde ja auch schon helfen)?
Die wird ja von Perl gesetzt, der Fehler allerdings
ist woanders.
Naja - immerhin wird $^E durchaus gesetzt (gerade
ausprobiert) ... $! leider wirklich nicht.
Vielleicht sollte er eher Backticks benutzen:
Du meinst, er sollte den Wert, den er mit seinen
ohnehin bereits benutzten Backticks auffängt, auch
irgendwie weiter verarbeiten? ;-)
Viele Grüße
Michael
Hallo Michael,
Wie kommt man denn nun am elegantesten an eine solche
Fehlermeldung (und ggf. den return code des ausge-
führten Kommandos, das würde ja auch schon helfen)?
Ich wuerde immer Backticks benutzen. Aber andere meinen da
sicher anderes :)
Eine andere Moeglichkeit waere es, die Meldungen in eine
Datei umleiten zu lassen:
system "$command 2>&1 >> /var/log/tarerrors";
Vielleicht sollte er eher Backticks benutzen:
Du meinst, er sollte den Wert, den er mit seinen
ohnehin bereits benutzten Backticks auffängt, auch
irgendwie weiter verarbeiten? ;-)
*g* In der Tat, ja :)
Gruesse,
CK
Hallo Christian,
Wie kommt man denn nun am elegantesten an eine solche
Fehlermeldung (und ggf. den return code des ausge-
führten Kommandos, das würde ja auch schon helfen)?
Ich wuerde immer Backticks benutzen. Aber andere meinen da
sicher anderes :)
Um was zu erreichen? Gerade bei Systemkommandos interessiert "mich als
Programm" doch zuallererst mal, ob der Returncode ungleich Null ist,
viel mehr als irgend ein Meldungstext, der womöglich sprachabhängig
ist und den ich doch ganz bestimmt nicht analysieren möchte ... ?
Viele Grüße
Michael
Hallo Michael,
Wie kommt man denn nun am elegantesten an eine solche
Fehlermeldung (und ggf. den return code des ausge-
führten Kommandos, das würde ja auch schon helfen)?
Ich wuerde immer Backticks benutzen. Aber andere meinen da
sicher anderes :)
Um was zu erreichen?
Eine Fehlermeldung.
Gerade bei Systemkommandos interessiert "mich als
Programm" doch zuallererst mal, ob der Returncode ungleich
Null ist, viel mehr als irgend ein Meldungstext, der
womöglich sprachabhängig ist und den ich doch ganz bestimmt
nicht analysieren möchte ... ?
Den will ich ja auch gar nicht analysieren. perldoc perlvar:
$? The status returned by the last pipe close,
backtick (``) command, or system() operator.
Note that this is the status word returned by
the wait() system call (or else is made up to
look like it). Thus, the exit value of the
subprocess is actually ($? >> 8), and $? & 127
gives which signal, if any, the process died
from, and $? & 128 reports whether there was
a core dump. (Mnemonic: similar to sh and ksh.)
Additionally, if the h_errno variable is
supported in C, its value is returned via $?
if any of the gethost*() functions fail.
Note that if you have installed a signal
handler for SIGCHLD, the value of $? will
usually be wrong outside that handler.
Inside an END subroutine $? contains the value
that is going to be given to exit(). You can
modify $? in an END subroutine to change the
exit status of the script.
Under VMS, the pragma use vmsish 'status'
makes $? reflect the actual VMS exit status,
instead of the default emulation of POSIX
status.
Also see the section on Error Indicators.
Gruesse,
CK
Moin Moin !
Schon man überprüft, ob der User, unter dem der Webserver läuft, auf dem Verzeichnis "/Volumes/Mac OS X/WebServer/Documents/" Schreibrechte und auf "/Volumes/Mac OS X/Verzeichnis" Leserechte hat ? (Und Execute-Rechte für tar ?)
Über den Perl-Stil lasse ich mich hier mal nicht aus.
Alexander