Использование perl `system` - PullRequest
       23

Использование perl `system`

3 голосов
/ 13 августа 2010

Я хотел бы запустить некоторую команду (например, command), используя perl's system(). Предположим, что command запускается из оболочки следующим образом:

command --arg1=arg1 --arg2=arg2 -arg3 -arg4

Как мне использовать system() для запуска command с этими аргументами?

Ответы [ 4 ]

9 голосов
/ 13 августа 2010

Лучшие практики: избегайте оболочки, используйте автоматическую обработку ошибок - IPC::System::Simple.

require IPC::System::Simple;
use autodie qw(:all);
system qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4);

use IPC::System::Simple qw(runx);
runx [0], qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4);
#     ↑ list of allowed EXIT_VALs, see documentation

Редактировать: следует разглагольствование.

Ответ Евгения включает ссылку на документацию к системе.Там мы можем увидеть смешанный кусок кода, который нужно включать каждый раз, чтобы правильно выполнить system.Ответ Евгения У показывает только его часть.

Всякий раз, когда мы находимся в такой ситуации, мы объединяем повторяющийся код в модуле.Я провожу параллели с правильной обработкой исключений без излишеств с помощью Try::Tiny, однако IPC::System::Simple, поскольку system сделано правильно , не видел этого быстрого принятия сообществом.Кажется, это нужно повторять чаще.

Итак, используйте autodie!Используйте IPC::System::Simple! Спасите себя от скуки, будьте уверены, что вы используете проверенный код.

5 голосов
/ 13 августа 2010
my @args = qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4);
system(@args) == 0 or die "system @args failed: $?";

Больше информации в perldoc .

1 голос
/ 13 августа 2010
my @args = ( "command", "--arg1=arg1", "--arg2=arg2", "-arg3", "-arg4" );
system(@args);
1 голос
/ 13 августа 2010

Как и во всем в Perl, есть несколько способов сделать это:)

Лучший способ, передать аргументы в виде списка:

system("command", "--arg1=arg1","--arg2=arg2","-arg3","-arg4");

Хотя иногда кажется, что программы не работают с этой версией (особенно, если они ожидают вызова из оболочки). Perl вызовет команду из оболочки, если вы сделаете это в виде одной строки.

system("command --arg1=arg1 --arg2=arg2 -arg3 -arg4");

Но эта форма медленнее.

...