выполняет команду и никогда не возвращается . Это как returnутверждение в функции.
Если команда не найдена, execвозвращается false. Он никогда не возвращает true, потому что, если команда найдена, она никогда не возвращается вообще. Там также нет смысла возвращаться STDOUT, STDERRили статус завершения команды. Вы можете найти документацию об этом perlfunc, потому что это функция.
система
выполняет команду, и ваш Perl-скрипт продолжается после ее завершения.
Возвращаемое значение является состоянием выхода команды. Вы можете найти документацию об этом в perlfunc.
обратные кавычки
Like systemвыполняет команду, и ваш Perl-скрипт продолжается после ее завершения.
В отличие systemот возвращаемого значения STDOUTкоманды.
qx//эквивалентно тэгам Вы можете найти документацию об этом в perlop, потому что в отличие от systemи execон является оператором.
Другие способы
Чего не хватает в вышесказанном, так это способа выполнить команду асинхронно. Это означает, что ваш Perl-скрипт и ваша команда выполняются одновременно. Это может быть достигнуто с open. Это позволяет вам читать STDOUT/ STDERRи писать в STDINвашей команды. Это зависит от платформы, хотя.
Есть также несколько модулей, которые могут облегчить эту задачу. Есть IPC::Open2и IPC::Open3и IPC::Run, а также
Win32::Process::Createесли вы находитесь на окнах.
Я думаю, что вы имеете в виду s / perlcunc / perlfunc / ... также документация perlipc подробно описывает открытие каналов.
Эфимент
7
perlcunc, может быть, это будет мой новый ник ;-)
Людвиг Вайнцерль
8
Для записи, backticks и qx [] также заполняют $? (ОС возвращает значение).
jjohn
167
В общем использовании I 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 linesmy@lines= qx/command arg1 arg2 arg3/;#in scalar context it returns the output as one stringmy $output = qx/command arg1 arg2 arg3/;
Используйте execвместе с тем, forkкогда вы хотите запустить команду, не заботитесь о ее выводе и не хотите ждать ее возвращения. systemдействительно просто
sub my_system {die"could not fork\n"unless defined(my $pid = fork);
return waitpid $pid,0if $pid;#parent waits for child
exec @_;#replace child with new process}
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 LIST, за исключением того, что сначала выполняется форк , а родительский процесс ожидает завершения дочернего процесса.
В отличие от exec и system , обратные кавычки дают не возвращаемое значение, а собранный STDOUT.
Строка, которая (возможно) интерполируется и затем выполняется как системная команда с / bin / sh или ее эквивалентом. Подстановочные знаки оболочки, каналы и перенаправления будут выполнены. Собранный стандартный вывод команды возвращается ; стандартная ошибка не изменяется
Альтернативы:
В более сложных сценариях, когда вы хотите получить STDOUT, STDERR или код возврата, вы можете использовать хорошо известные стандартные модули, такие как IPC :: Open2 и IPC :: Open3 .
Это грубый ответ. Вы должны попытаться помочь без гнева.
Шейн С. Мейсон,
1
Я думаю, что он просто делал ссылку на старый RTFM: P
v3.
на самом деле это не означало грубости;) удалил е-слово, чтобы избежать недоразумений ...
Бенедикт Вальдвогель
2
Я, конечно, не интерпретировал это как грубость. Может быть, грубовато, но это не очень умный вопрос, требующий вдумчивого ответа.
ephemient
11
В чем разница между бэксиками 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/perlprint"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/perlprint"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, включение команды в backticks выполняет эту команду, и ваш Perl-скрипт возобновляется после ее завершения. В отличие от system, возвращаемое значение имеет STDOUTкоманду. qx//эквивалентно тэгам Вы можете найти документацию об этом в perlop , потому что, в отличие от системы exec, она является оператором.
Например:
#!/usr/bin/perlprint"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 для запуска команд оболочки, и я думаю, что есть модуль оболочки - 'use shell', который дает вам прозрачный доступ к типичным командам оболочки.
Возможно, вы имеете в виду use Shell;( search.cpan.org/dist/Shell/Shell.pm )? Это не широко установлено, и это не применимо к вопросу, я думаю ...
ephemient
1
Последняя часть его вопроса была «есть ли другие способы запуска команд оболочки?» - это еще один способ запуска команд оболочки.
Шейн С. Мейсон,
2
Документы специально заявляют: «Этот пакет включен в качестве демонстрационного примера, иллюстрирующего некоторые возможности Perl. Он не должен использоваться для производственных программ. Хотя он предоставляет простой интерфейс для получения стандартного вывода произвольных команд, может быть лучше способы достижения того, что вам нужно. "
час. Оуэнс
2
Опять же, он ответил на его вопрос «есть ли другие пути»
Шейн С. Мейсон,
Плохие, неподдерживаемые способы не следует давать без предупреждения о том, что они плохие и не поддерживаются.
Ответы:
Exec
выполняет команду и никогда не возвращается . Это как
return
утверждение в функции.Если команда не найдена,
exec
возвращается false. Он никогда не возвращает true, потому что, если команда найдена, она никогда не возвращается вообще. Там также нет смысла возвращатьсяSTDOUT
,STDERR
или статус завершения команды. Вы можете найти документацию об этомperlfunc
, потому что это функция.система
выполняет команду, и ваш Perl-скрипт продолжается после ее завершения.
Возвращаемое значение является состоянием выхода команды. Вы можете найти документацию об этом в
perlfunc
.обратные кавычки
Like
system
выполняет команду, и ваш Perl-скрипт продолжается после ее завершения.В отличие
system
от возвращаемого значенияSTDOUT
команды.qx//
эквивалентно тэгам Вы можете найти документацию об этом вperlop
, потому что в отличие отsystem
иexec
он является оператором.Другие способы
Чего не хватает в вышесказанном, так это способа выполнить команду асинхронно. Это означает, что ваш Perl-скрипт и ваша команда выполняются одновременно. Это может быть достигнуто с
open
. Это позволяет вам читатьSTDOUT
/STDERR
и писать вSTDIN
вашей команды. Это зависит от платформы, хотя.Есть также несколько модулей, которые могут облегчить эту задачу. Есть
IPC::Open2
иIPC::Open3
иIPC::Run
, а такжеWin32::Process::Create
если вы находитесь на окнах.источник
В общем использовании I
system
,open
,IPC::Open2
или вIPC::Open3
зависимости от того, что я хочу сделать.qx//
Оператор, в то время как простые, слишком сдерживая в своей функциональности будет очень полезен вне быстрых взломов. Я считаю,open
что гораздо удобнее.system
: запустите команду и дождитесь ее возвращенияИспользуется,
system
когда вы хотите запустить команду, не заботитесь о ее выводе и не хотите, чтобы скрипт Perl делал что-либо, пока команда не завершится.или
qx//
или `` : запустить команду и перехватить ее STDOUTИспользуется,
qx//
когда вы хотите запустить команду, записать то, что она пишет в STDOUT, и не хотите, чтобы скрипт Perl делал что-либо, пока команда не завершится.exec
: заменить текущий процесс другим процессом.Используйте
exec
вместе с тем,fork
когда вы хотите запустить команду, не заботитесь о ее выводе и не хотите ждать ее возвращения.system
действительно простоВы также можете прочитать
waitpid
иperlipc
руководства.open
: запустить процесс и создать канал для его STDIN или STDERRИспользуется,
open
когда вы хотите записать данные в STDIN процесса или прочитать данные из STDOUT процесса (но не одновременно в оба).IPC :: Open2 : запустить процесс и создать канал для STDIN и STDOUT
Используйте,
IPC::Open2
когда вам нужно читать и писать в STDIN и STDOUT процесса.IPC :: Open3 : запустить процесс и создать канал для STDIN, STDOUT и STDERR
используйте,
IPC::Open3
когда вам нужно захватить все три стандартных файловых дескриптора процесса. Я бы написал пример, но он работает в основном так же, как IPC :: Open2, но с несколько другим порядком аргументов и дескриптором третьего файла.источник
Позвольте мне сначала процитировать руководства:
perldoc exec () :
система perldoc () :
В отличие от exec и system , обратные кавычки дают не возвращаемое значение, а собранный STDOUT.
perldoc `String` :
Альтернативы:
В более сложных сценариях, когда вы хотите получить STDOUT, STDERR или код возврата, вы можете использовать хорошо известные стандартные модули, такие как IPC :: Open2 и IPC :: Open3 .
Пример:
И наконец, IPC :: Run from CPAN также стоит посмотреть…
источник
В чем разница между бэксиками Perl (
`
)system
иexec
?exec
exec
выполняет команду и никогда не возобновляет сценарий Perl. Это для сценария, какreturn
утверждение для функции.Если команда не найдена,
exec
возвращает false. Он никогда не возвращает true, потому что, если команда найдена, она никогда не возвращается вообще. Там также нет смысла возвращатьсяSTDOUT
,STDERR
или статус завершения команды. Вы можете найти документацию об этом в perlfunc , потому что это функция.Например:
В приведенном выше коде есть три
print
оператора, но из-заexec
выхода из сценария выполняется только первый оператор печати. Кроме того,exec
вывод команды не присваивается какой-либо переменной.Здесь только вы получаете вывод только первого
print
оператора и выполненияls
команды на стандартном выходе.system
system
выполняет команду, и ваш Perl-скрипт возобновляется после ее завершения. Возвращаемое значение является состоянием выхода команды. Вы можете найти документацию об этом в perlfunc .Например:
В приведенном выше коде есть три
print
утверждения. Когда сценарий возобновляется послеsystem
команды, все три оператора печати выполняются.Кроме того , результат работы
system
будет назначенdata2
, но присвоенное значение0
(выход код изls
).Здесь вы получаете выходные данные первого
print
оператора, затемls
команды, а затем выходные данные двух последнихprint
операторов стандартного вывода.backticks (
`
)Например
system
, включение команды в backticks выполняет эту команду, и ваш Perl-скрипт возобновляется после ее завершения. В отличие отsystem
, возвращаемое значение имеетSTDOUT
команду.qx//
эквивалентно тэгам Вы можете найти документацию об этом в perlop , потому что, в отличие от системыexec
, она является оператором.Например:
В приведенном выше коде есть три
print
оператора, и все три выполняются. Выходные данныеls
не собираются напрямую стандартизироваться, а присваиваются переменнойdata2
и затем печатаются в последнем операторе печати.источник
Разница между «exec» и «system» заключается в том, что exec заменяет вашу текущую программу на «command», и НИКОГДА не возвращается в вашу программу. Система, с другой стороны, разветвляется и запускает «команду» и возвращает вам состояние завершения «команды», когда она завершена. Обратный тик запускает «команду», а затем возвращает строку, представляющую его стандарт (что бы оно ни выводило на экран)
Вы также можете использовать popen для запуска команд оболочки, и я думаю, что есть модуль оболочки - 'use shell', который дает вам прозрачный доступ к типичным командам оболочки.
Надеюсь, это прояснит это для вас.
источник
use Shell;
( search.cpan.org/dist/Shell/Shell.pm )? Это не широко установлено, и это не применимо к вопросу, я думаю ...