Pipeline bauen?
am 05.03.2006 22:43:05 von Josef Wolf
Hallo!
Ich versuche in Perl eine pipeline zu bauen. Im Prinzip soll das also
sowas wie open($zip, "| gzip | gzip -d") werden, ich will aber die shell
vermeiden, weil das ein setuid-script werden soll. Eigentlich habe ich
mir das recht einfach zurechtgelegt:
#!/usr/bin/perl
use strict;
use warnings;
open (my $unzip, "|-", "gzip", "-d") or die; print STDERR "huhu\n";
open (STDOUT, ">&", $unzip) or die; print STDERR "huhu1\n";
close $unzip; print STDERR "huhu2\n";
open (my $zip, "|-", "gzip") or die; print STDERR "huhu3\n";
open (STDOUT, ">&", $zip) or die; print STDERR "huhu4\n";
print $zip "asdf";
close $zip;
Das Ganze bleibt aber nach "huhu1" (also bei close $unzip) haengen.
Wenn ich das "close $unzip" auskomentiere, dann bleibt das script bei
"close $zip" haengen. Ganz gleich was ich mache, das script bleibt immer
haengen :-(
Hat jemand eine Idee, was ich da flasch mache? Wie baut man sauber eine
pipe-Kette? Obiges (zweistufige) soll nur als Beispiel dienen, in
Wirklichkeit brauche ich beliebig lange pipes.
Re: Pipeline bauen?
am 05.03.2006 23:29:59 von Slaven Rezic
Josef Wolf writes:
> Hallo!
>
> Ich versuche in Perl eine pipeline zu bauen. Im Prinzip soll das also
> sowas wie open($zip, "| gzip | gzip -d") werden, ich will aber die shell
> vermeiden, weil das ein setuid-script werden soll. Eigentlich habe ich
> mir das recht einfach zurechtgelegt:
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> open (my $unzip, "|-", "gzip", "-d") or die; print STDERR "huhu\n";
> open (STDOUT, ">&", $unzip) or die; print STDERR "huhu1\n";
> close $unzip; print STDERR "huhu2\n";
>
> open (my $zip, "|-", "gzip") or die; print STDERR "huhu3\n";
> open (STDOUT, ">&", $zip) or die; print STDERR "huhu4\n";
>
> print $zip "asdf";
> close $zip;
>
> Das Ganze bleibt aber nach "huhu1" (also bei close $unzip) haengen.
> Wenn ich das "close $unzip" auskomentiere, dann bleibt das script bei
> "close $zip" haengen. Ganz gleich was ich mache, das script bleibt immer
> haengen :-(
>
> Hat jemand eine Idee, was ich da flasch mache? Wie baut man sauber eine
> pipe-Kette? Obiges (zweistufige) soll nur als Beispiel dienen, in
> Wirklichkeit brauche ich beliebig lange pipes.
>
Um ein verknotetes Gehirn zu vermeiden, benutze ich meist IPC::Run.
Hier ein (sinnloses) Beispiel, wie man das Modul nutzen kann:
perl -MIPC::Run=run -e 'run ["cat", "$ENV{HOME}/.cshrc"], "|",
["head", "-20"], "|", ["grep", "^#"], "|", ["cut", "-c2-"]'
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Visualize XML files in a Tk text widget:
http://search.cpan.org/search?mode=module&query=Tk::XMLViewe r