Pedro thomi: tar-archive

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.

  1. 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

    1. 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

      1. hi!

        qx($command);
        Vielleicht sollte er eher Backticks benutzen:
        print $command 2>&1;

        Wo soll da der Unterschied sein? `` und qx{} haben genau die gleiche
        Funktion (siehe perldoc perlop).

        bye, Frank!

        1. Hi Frank,

          qx($command);
          Vielleicht sollte er eher Backticks benutzen:
          print $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

          1. 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.

      2. 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

        1. 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

          1. 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

            1. 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

      3. 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