[ Это составлено как ответ на другой вопрос , который был закрыт как дубликат этого. ]
Выполнение команды оболочки требует выполнения оболочки. С этой целью
system($shell_command)
эквивалентно
system('/bin/sh', '-c', $shell_command)
Таким образом, все ваши примеры запускают одну программу (/bin/sh
). Если вы хотите получить статус выхода нескольких детей, вам нужно иметь несколько детей!
use IPC::Open3 qw( open3 );
open(local *CHILD1_STDIN, '<', '/dev/null')
or die $!;
pipe(local *CHILD2_STDIN, local *CHILD1_STDOUT)
or die $!;
my $child1_pid = open3(
'<&CHILD1_STDIN',
'>&CHILD1_STDOUT',
'>&STDERR',
'prog1', 'arg1', 'arg2',
);
my $child2_pid = open3(
'<&CHILD2_STDIN',
'>&STDOUT',
'>&STDERR',
'prog2', 'arg1', 'arg2',
);
my @pipe_status = map { waitpid($_, 0) } $child1_pid, $child2_pid;
IPC :: Open3 - довольно низкий уровень. IPC :: Run3 и / или IPC :: Run могут сделать это проще. [Обновление: действительно, IPC :: Run делает ].