Как я могу перенаправить вывод системы Perl () в дескриптор файла? - PullRequest
3 голосов
/ 27 апреля 2010

С помощью команды open в Perl вы можете использовать файловый дескриптор. Однако у меня проблемы с возвратом кода выхода с помощью команды open в Perl.

С помощью команды system в Perl я могу вернуть код завершения программы, которую я запускаю. Однако я хочу просто перенаправить STDOUT на какой-нибудь файловый дескриптор (без stderr).

Мой стандартный вывод будет построчным выводом пар ключ-значение, которые я хочу вставить в mao в perl. Вот почему я хочу перенаправить только мой стандартный вывод из моей Java-программы на Perl. Это возможно?

Примечание: если я получаю ошибки, они печатаются в stderr. Одна из возможностей - проверить, печатается ли что-либо в stderr, чтобы я мог использовать скрипт Perl.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2010

Канонически, если вы пытаетесь получить текстовый вывод разветвленного процесса, я понимаю, что для этого нужны обратные ссылки. Если вам также нужен статус выхода, вы можете проверить его с помощью специальной переменной $?, например ::

open my $fh, '>', "output.txt" or die $!;
print {$fh} `echo "Hello!"`;
print "Return code: $?\n";

Вывод в STDERR команды из обратных кавычек не будет записан, но вместо этого будет записан непосредственно в STDERR в программе Perl, из которой он вызывается.

3 голосов
/ 27 апреля 2010

Возможно, вы захотите проверить IPC :: System :: Simple - он дает вам много возможностей для выполнения внешних команд, захвата его выходного и возвращаемого значения и, возможно, смерти, если возвращается плохой результат .

1 голос
/ 27 апреля 2010

Используйте open в режиме -|. Когда вы close говорите о файле, статус выхода будет $?.

open my $fh, '-|', "$command";  # older version:  open my $fh, "$command |";
my @command_output = <$fh>;
close $fh;
my $command_status = $?;

С perldoc -f close

Если дескриптор файла пришел из открытого канала, "close" будет дополнительно вернуть false, если один из других системных вызовов сбои в работе, или если программа завершает работу с ненулевым статусом. (Если единственная проблема заключалась в том, что программа вышла не из нуля, $! будет установлен на 0.) Закрытие канала также ждет процесса выполнение на трубе, чтобы завершить, если вы хотите посмотреть на потом выводит трубу и неявно ставит выход значение статуса этой команды в $? и "${^CHILD_ERROR_NATIVE}".

0 голосов
/ 27 апреля 2010

Это один из способов сделать это.

open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
    open STDOUT, '>&', $fh;
    exec($command, @args);
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";
...