Что-то вроде exec() для возврата значения в Perl?

#linux #perl #exec

#linux #perl #exec

Вопрос:

У меня сложилось впечатление (возможно, ошибочно), что функция ‘exec’ в Perl не возвращает значение (у меня создается впечатление, что она просто выполняет команду). Ситуация такова, что на сервере запущен Perl-скрипт, и мне нужно вызвать этот скрипт для выполнения команд внутри окна Linux, но также и для возврата результатов. Как это можно сделать?

Комментарии:

1. exec не возвращает вообще. Вы имеете в system виду? Вам нужен статус возврата дочернего процесса или результат?

2. Nitpick: exec может возвращаться в некоторых случаях сбоя, например, исполняемый файл не найден или не выполняется.

3. Серьезно, насколько сложно на самом деле взглянуть perldoc -f exec , прежде чем публиковать? Конечно, у вас есть полное право опубликовать это, и я действительно поддержу правильные ответы, но я уверен, что не хотел бы работать с кем-то, кто вообще не может заставить себя прочитать какую-либо документацию.

Ответ №1:

Если под «возвращением результатов» вы подразумеваете возврат стандартного вывода команд, то вам нужны обратные ссылки или qx() . Например.:

 my $result = qx(echo foo);
# or
my $result2 = `echo foo`;
 

Обратите внимание, что сообщения в STDERR не возвращаются.

Если вы имеете в виду статус завершения программы, используйте system:

 my $status = system("echo foo");
# or
my $status2 = system("/bin/echo", "foo", "bar");
 

Комментарии:

1. Спасибо, но что я здесь делаю не так———> … мой $result = qx(эхо-пинг -c 4 www.google.com ); возвращает $resu< }

2. @JohnR Команда должна быть точно такой, какой вы вводите ее в командной строке. Я подозреваю , что вы хотели сделать именно это qx(ping -c 4 www.google.com) .

3. Спасибо за ответ. Я не знаю Perl.

4. @JohnR Теперь ты знаешь немного больше. =)

Ответ №2:

exec() не только не возвращает значение, но и вообще не возвращает.

perldoc -f exec

Функция exec выполняет системную команду и никогда не возвращает use system вместо exec, если вы хотите, чтобы она возвращалась.

Но я почти уверен, что вам НЕ нужно возвращаемое значение system(), вам, похоже, нужен вывод команды, так что:

perldoc -f system

Это не то, что вы хотите использовать для захвата выходных данных команды, для этого вам следует использовать просто обратные ссылки или qx// , как описано в perlop/» STRING » .

Ответ №3:

Обычный способ perl запустить программу и сохранить ее результаты — это обратные ссылки:

 my $foo = `ls`;
 

Ответ №4:

Из документации : http://perldoc.perl.org/functions/system.html

Я обычно использую это :

 if(system(@args) != 0)
{
if ($? == -1) {
        print "failed to execute: $!n";
    }
    elsif ($? amp; 127) {
        printf "child died with signal %d, %s coredumpn",
            ($? amp; 127),  ($? amp; 128) ? 'with' : 'without';
    }
    else {
        printf "child exited with value %dn", $? >> 8;
    }
}
 

Ответ №5:

Захват стандартного вывода:

 my $dir = `pwd`;
my $dir = qx/pwd/;
 

Фиксировать статус возврата:

 my $rc = system('pwd');
 

Perldoc фиксирует STDERR и STDOUT:

 my $output = `cmd 2>amp;1`;
 

Смотрите Ссылку для других способов захвата одного выходного потока, но не другого

Комментарии:

1. «моя система (‘pwd’);»?? Я предполагаю, вы имеете в виду «my $ rc = system(‘pwd’);» 🙂

Ответ №6:

использование обратного тика

 my $var = `shell command`;
 

в perl позволяет выполнять команды оболочки и возвращает все, что было на выходе.