В чем разница между backticks, system и exec Perl?



может кто-то пожалуйста, помогите мне? В Perl, в чем разница между:



exec "command";


и



system("command");


и



print `command`;


есть ли другие способы запускать команды оболочки?

548   5  

5 ответов:

exec

выполняет команду и никогда не возвращает. Это как return оператор в функции.

если команда не найдена exec возвращает false. Он никогда не возвращает true, потому что если команда найдена, она никогда не возвращается вообще. Также нет смысла возвращаться STDOUT,STDERR или состояние выхода команды. Вы можете найти документацию об этом в perlfunc, потому что это функция.

система

выполняет команду, и ваш сценарий Perl продолжается после завершения команды.

возвращаемое значение-это состояние выхода команды. Вы можете найти документацию об этом в perlfunc.

backticks

как system выполняет команду, и ваш сценарий perl продолжается после того, как команда имеет законченный.

в отличие system возвращаемое значение STDOUT команды. qx// эквивалентно обратные апострофы. Вы можете найти документацию об этом в perlop, потому что в отличие от system и execЭто оператор.


другие способы

что отсутствует в приведенном выше способ выполнить команду асинхронно. Это означает, что ваш скрипт perl и ваша команда работать одновременно. Это можно сделать с помощью open. Это позволяет читать STDOUT/STDERR и писать STDIN вашей команды. Это зависит от платформы, хотя.

есть также несколько модулей, которые могут облегчить эту задачу. Есть IPC::Open2 и IPC::Open3 и IPC::Run, а также Win32::Process::Create если вы находитесь на Windows.

вообще я использую system,open,IPC::Open2 или IPC::Open3 в зависимости от того, что я хочу сделать. Элемент qx// оператор, в то время как простой, слишком ограничивает в своей функциональности, чтобы быть очень полезным за пределами быстрых хаков. Я нахожу open гораздо сподручнее.

system: запустите команду и дождитесь ее возврата

использовать system когда вы хотите запустить команду, не заботьтесь о ее выводе и не хотите, чтобы скрипт Perl делал что-либо до тех пор, пока команда заканчивается.

#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");

или

#spawns a shell, arguments are interpreted by the shell, use only if you
#want the shell to do globbing (e.g. *.txt) for you or you want to redirect
#output
system("command arg1 arg2 arg3");

qx// или `: выполнить команду и захватить ее STDOUT

использовать qx// когда вы хотите запустить команду, захватите то, что она пишет в STDOUT, и не хотите, чтобы скрипт Perl что-либо делал, пока команда не завершится.

#arguments are always processed by the shell

#in list context it returns the output as a list of lines
my @lines = qx/command arg1 arg2 arg3/;

#in scalar context it returns the output as one string
my $output = qx/command arg1 arg2 arg3/;

exec: замените текущий процесс другим процессом.

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

sub my_system {
    die "could not fork\n" unless defined(my $pid = fork);
    return waitpid $pid, 0 if $pid; #parent waits for child
    exec @_; #replace child with new process
}

вы также можете прочитать waitpid и perlipc учебные пособия.

open: запустите процесс и создайте канал для его STDIN или STDERR

использовать open если вы хотите записать данные в STDIN процесса или прочитать данные из процесса STDOUT (но не оба одновременно).

#read from a gzip file as if it were a normal file
open my $read_fh, "-|", "gzip", "-d", $filename
    or die "could not open $filename: $!";

#write to a gzip compressed file as if were a normal file
open my $write_fh, "|-", "gzip", $filename
    or die "could not open $filename: $!";

IPC:: Open2: запустите процесс и создайте канал для STDIN и STDOUT

использовать IPC::Open2 когда вам нужно читать и писать в STDIN и STDOUT процесса.

use IPC::Open2;

open2 my $out, my $in, "/usr/bin/bc"
    or die "could not run bc";

print $in "5+6\n";

my $answer = <$out>;

IPC:: Open3: запустите процесс и создайте канал для STDIN, STDOUT и STDERR

использовать IPC::Open3 когда вам нужно захватить все три стандартных файловых дескрипторов процесса. Я бы написал пример, но он работает в основном так же, как и IPC::Open2, но с несколько иным порядком аргументов и третьим дескриптором файла.

позвольте мне сначала процитировать инструкции:

perldoc exec ():

функция exec выполняет системную команду и никогда не возвращает - используйте система вместо exec если вы хотите вернуть

perldoc system ():

делает то же самое , что и exec LIST, за исключением того, что вилка делается во-первых, и родительский процесс ждет, пока дочерний процесс, чтобы закончить.

В отличие от exec и система, backticks не дают вам возвращаемое значение, но собранный STDOUT.

perldoc 'String':

строка, которая (возможно) интерполируется и затем выполняется как системная команда с / bin / sh или его эквивалент. Подстановочные знаки оболочки, каналы и перенаправления будут соблюдены. Собранные возвращается стандартный вывод команды; Стандартная ошибка не влияет.


варианты:

в более сложных сценариях, где вы хотите получить STDOUT, STDERR или код возврата, вы можете использовать хорошо известные стандартные модули, такие как IPC:: Open2 и IPC:: Open3.

пример:

use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;

наконец, IPC:: Run из CPAN тоже стоит посмотреть...

в чем разница между задними палочками Perl (`),system и exec?

exec -> exec "command"; ,
system -> system("command"); and 
backticks -> print `command`;

exec

exec выполняет команду и никогда не возобновляет скрипт на Perl. Это к сценарию, как return оператор является функцией.

если команда не найдена, exec возвращает false. Он никогда не возвращает true, потому что если команда найдена, она никогда не возвращается вообще. Также нет смысла возвращаться STDOUT,STDERR или выход состояние команды. Вы можете найти документацию об этом в perlfunc, потому что это функция.

например:

#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";

в приведенном выше коде, есть три print заявления, но из-за exec оставляя скрипт, выполняется только первый оператор печати. Кроме того,exec вывод команды не назначается ни одной переменной.

здесь, только вы только получаете выход первого print утверждение и выполнение ls команда на стандартном выходе.

system

system выполняет команду, и ваш сценарий Perl возобновляется после завершения команды. Возвращаемое значение-это состояние выхода команды. Вы можете найти документацию об этом в perlfunc.

например:

#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";

в приведенном выше коде, есть три print заявления. Как скрипт возобновляется после system команда, все три печати заявления выполненный.

кроме того, результат выполнения systemи назначена data2, но присвоенное значение 0 (код выхода из ls).

здесь вы получаете выход первого print утверждение, то, что ls команда, за которой следуют выходы последних двух print заявления на стандартный выход.

backticks (`)

как system, заключив команду в обратные кавычки выполняет, что команда и ваш сценарий Perl возобновляется после завершения команды. В отличие от system возвращаемое значение STDOUT команды. qx// эквивалентно обратные апострофы. Вы можете найти документацию об этом в perlop, потому что в отличие от системы и exec, это оператор.

например:

#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";

в приведенном выше коде, есть три print заявления и все три выполняются. Выход ls не идет к стандарту напрямую, но присваивается переменной data2 и затем печатается по окончательному заявлению печати.

разница между "exec" и "system" заключается в том, что exec заменяет текущую программу на "command" и никогда не возвращается в вашу программу. система, с другой стороны, разветвляется и запускает "команду" и возвращает вам статус выхода "команды", когда она выполняется. Задняя галочка запускает "команду" , а затем возвращает строку, представляющую ее стандартный выход (независимо от того, что она напечатала бы на экране)

вы также можете использовать popen для запуска команд оболочки, и я думаю, что есть оболочка модуль - "использовать оболочку", которая дает вам прозрачный доступ к типичным командам оболочки.

надеюсь, что это проясняет его для вас.

Comments

    Ничего не найдено.