... sull'altro lato se scrivo qualcosa nelle pipe prima di aprire quella successiva, ciò non accade.Quando si aprono n pipe a processi figlio che eseguono xargs da Perl, i processi n-1 ricevono una riga vuota
Il seguente codice dovrebbe rendere più chiaro:
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);
L'esecuzione del test ottengo
./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
Come si può vedere in Test 0, aprendo i 3 tubi di fila senza alcun output in tra genera 2 linee vuote. Stranamente, se sostituisco xargs echo
con cat -
non ci sono linee vuote prodotte. Il comportamento degli xargs sembra anche contraddire la sua pagina man, che afferma Blank lines on the standard input are ignored.
Come posso evitare quelle linee vuote?
Questo succede con Perl 5.14.2 su cygwin/XP e con Perl 5.8.8 su HP-UX 11.00.
scrivo quello che sto davvero cercando di fare alla fine, dal momento che è irrilevante in questa sede:
efficiente di pulizia tutti gli oggetti derivati visibile da tutte le viste ClearCase attraverso uno script Perl che si biforca un unico processo per view per rimuovere il file (xargs rm) prima di rimuoverli dai VOB (rmdo).
Ben fatto per fornire un esempio completo. – Sobrique