#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 позволяет выполнять команды оболочки и возвращает все, что было на выходе.