... с другой стороны, если я пишу что-то в трубах, прежде чем открывать следующую, этого не произойдет.При открытии n каналов дочерним процессам, выполняющим xargs из Perl, процессы n-1 получают пустую строку
Следующий код должен сделать его более ясным:
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);
Запуск теста я получаю
./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
Как вы можете видеть в тесте 0, открывая 3 трубы подряд без выхода в между генерирует 2 пустые строки. Как ни странно, если я подменю xargs echo
на cat -
, то не будет выпущено пустых линий. Поведение xargs также противоречит его странице руководства, в которой говорится: Blank lines on the standard input are ignored.
Как я могу избежать этих пустых строк?
Это происходит с Perl 5.14.2 на cygwin/XP и с Perl 5.8.8 на HP-UX 11.00.
Я пишу то, что я на самом деле пытаюсь сделать в конце, так как это не имеет значения здесь:
эффективны очистки всех полученных объектов, видимые со всех ClearCase взглядов через скрипт на Perl, который разветвляется один процесс в целях удаление файлы (xargs rm), прежде чем удалять их из VOB (rmdo).
Хорошо сделано, поставляя полный пример. – Sobrique