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, но с несколько иным порядком аргументов и третьим дескриптором файла.
позвольте мне сначала процитировать инструкции:
функция exec выполняет системную команду и никогда не возвращает - используйте система вместо exec если вы хотите вернуть
делает то же самое , что и exec LIST, за исключением того, что вилка делается во-первых, и родительский процесс ждет, пока дочерний процесс, чтобы закончить.
В отличие от exec и система, backticks не дают вам возвращаемое значение, но собранный STDOUT.
строка, которая (возможно) интерполируется и затем выполняется как системная команда с / 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";в приведенном выше коде, есть три
execоставляя скрипт, выполняется только первый оператор печати. Кроме того,execвывод команды не назначается ни одной переменной.здесь, только вы только получаете выход первого
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";в приведенном выше коде, есть три
systemкоманда, все три печати заявления выполненный.кроме того, результат выполнения
systemи назначенаdata2, но присвоенное значение0(код выхода изls).здесь вы получаете выход первого
lsкоманда, за которой следуют выходы последних двух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";в приведенном выше коде, есть три
lsне идет к стандарту напрямую, но присваивается переменнойdata2и затем печатается по окончательному заявлению печати.
разница между "exec" и "system" заключается в том, что exec заменяет текущую программу на "command" и никогда не возвращается в вашу программу. система, с другой стороны, разветвляется и запускает "команду" и возвращает вам статус выхода "команды", когда она выполняется. Задняя галочка запускает "команду" , а затем возвращает строку, представляющую ее стандартный выход (независимо от того, что она напечатала бы на экране)
вы также можете использовать popen для запуска команд оболочки, и я думаю, что есть оболочка модуль - "использовать оболочку", которая дает вам прозрачный доступ к типичным командам оболочки.
надеюсь, что это проясняет его для вас.
Comments