Font
[thread]7509[/thread]

Fehlererkennung bei Programmausführung mit "open"



<< >> 6 entries, 1 page
thuhn
 2005-11-29 17:57
#60559 #60559
User since
2005-11-29
3 articles
BenutzerIn
[default_avatar]
Hallo,

ich sammele in einem Perlprogramm eine Liste von Dateien zusammen aus denen ein Tar-Paket erzeugt werden soll. Diese werden an das tar-Programm per xargs übergeben. Ich könnte natürlich die Dateien auch erst in eine Datei schreiben und mit "tar ... -T file" arbeiten, aber irgendwie muss es doch auch möglich sein den Fehler beim "open" zu erkennen.

Folgender Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
if ( open(TAR, "| xargs -0 tar czf $patchFile") )
{
foreach my $file ( @filelist )
{
print TAR "$file\0";
}
} else
{
# Fehlerbehandlung
print "Hat nicht funktioniert\n";
}
close(TAR);
print "Alles ok\n";


Folgendes Problem:
Kann z.B. die Zieldatei nicht angelegt werden sehe ich zwar eine entsprechende Meldung auf STDERR, die "# Fehlerbehandlung" wird aber nie durchlaufen und stattdessen wird "Alles ok" angezeigt.

Wie kann man bei "open" den Fehler abfangen?

Crian: Code-Tags\n\n

<!--EDIT|Crian|1133779220-->
Relais
 2005-11-29 18:14
#60560 #60560
User since
2003-08-06
2243 articles
ModeratorIn
[Homepage] [default_avatar]
Du hast schon richtig die Möglichen Fehler bei open() abgefangen.
Es gab auch keine.

Dein Aufruf von open() öffnet aber gar keine Datei, er öffnet stattdessen eine Pipe an das Kommando xargs. Dessen mögliche Fehler sind von hier ausgesehen zu obskur, als daß ich Dir da mehr zu sagen könnte, kenne micht mit xargs nicht aus.

Also, wie kann man die Fehler bei xargs abfangen?
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
thuhn
 2005-11-29 18:46
#60561 #60561
User since
2005-11-29
3 articles
BenutzerIn
[default_avatar]
Ok, danke. Ich werde dann wohl den Workaround über die Include-Datei nehmen müssen.

Nur falls es interessiert noch etwas zu xargs:
xargs wird hier verwendet um bei der Übergabe der Kommandozeilenargumente (Dateien) keine Probleme bei Dateinamen mit Leerzeichen zu bekommen. In Perl wird an die Dateien \0 angehängt, xargs -0 liest die eigenen Argumente von STDIN und teilt sie bei jedem \0 auf.

Würde man einfach die Dateinamen mit Blank separiert an das tar übergaben (z.B. system("tar czg package.tgz file1 file2 ...")) würden die Dateinamen mit Blank nicht funktionieren. Aber das umgeht man ja mit der include-Datei ebenfalls.
thuhn
 2005-11-29 18:52
#60562 #60562
User since
2005-11-29
3 articles
BenutzerIn
[default_avatar]
Oder man baut anstelle dem @filelist array einen String, z.B.

$filelist .= "'$filelist' "; # Hochkommata verwenden wegen mögl. Blanks

my $exitCode = system("tar czf $patchFile $filelist");

sollte auch gehen.
Strat
 2005-11-29 19:31
#60563 #60563
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
oder man fragt auch bei close(...) auf moegliche fehler ab... da muesstest du ihn eigentlich mitbekommen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2005-11-29 21:50
#60564 #60564
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
oder einfach CPAN:Archive::Tar verwenden.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 6 entries, 1 page



View all threads created 2005-11-29 17:57.