... auf der anderen Seite ausgeführt wird, wenn ich etwas zu den Rohren schreiben, bevor die nächste Öffnung, dies nicht geschieht.Wenn n Rohre Kindprozesse öffnen xargs von Perl, n-1-Prozesse erhalten eine leere Zeile
Der folgende Code sollte es klarer machen: Ich bekomme
./test_pipe_2_xargs.pl
Test 0: open all pipes before writing
world world world
Test 1: write Hello before opening next pipe
Hello
Hello
Hello world world world
sub test_concurrent_pipes
{
my $write_at_once = $_[0];
my $pipe_handle;
my @pipe_handle_list;
my $i;
foreach $i (1..3)
{
open ($pipe_handle, "| xargs echo") or die ("Cannot open pipe.\n");
if ($write_at_once == 1)
{
print $pipe_handle "Hello\n";
}
push(@pipe_handle_list, $pipe_handle);
}
foreach $pipe_handle (@pipe_handle_list)
{
print $pipe_handle "world\n";
}
foreach $pipe_handle (@pipe_handle_list)
{
close ($pipe_handle);
}
}
print "Test 0: open all pipes before writing\n";
test_concurrent_pipes(0);
print "Test 1: write Hello before opening next pipe\n";
test_concurrent_pipes(1);
den Test Rennen Wie Sie in Test 0, das Öffnen der drei Rohre in einer Reihe ohne Ausgabe sehen in dazwischen erzeugt 2 leere Zeilen. Seltsamerweise, wenn ich xargs echo
durch cat -
ersetze, werden keine leeren Zeilen erzeugt. Das Xargs-Verhalten scheint auch seine man-Seite zu widersprechen, die besagt Blank lines on the standard input are ignored.
Wie kann ich diese leeren Zeilen vermeiden?
Dies geschieht mit Perl 5.14.2 auf Cygwin/XP und mit Perl 5.8.8 auf HP-UX 11.00.
ich schreiben, was ich wirklich bin versucht, am Ende zu tun, da es hier irrelevant ist:
effizient Bereinigung all abgeleiteten Objekte sichtbar aus allen Clearcase Ansichten über einen Perl-Skript, das Gabeln ein Prozess pro Ansicht die entfernen Dateien (xargs rm), bevor Sie sie aus den VOBs (rmdo) entfernen.
Gut gemacht bei der Lieferung eines vollständigen Beispiels. – Sobrique