Почему IPC :: System :: Simple (capture) не работает с аргументами - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь вызвать второй скрипт из основного скрипта.Когда я передаю аргумент в самой команде с помощью захвата, он работает.Но когда я пытаюсь отправить команду и аргументы отдельно в функции захвата, она выдает ошибку, что не может найти указанный файл.

Второй скрипт

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my $word= $ARGV[0];

my $crpyt = "$word crypted";
print "$crpyt\n";

my $decrypt = "$word decrypted";
print "$decrypt\n";

main.pl

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use IPC::System::Simple qw(capture capturex);

my $cmd= 'perl xyz.pl Hello';
my @arr = capture($cmd);

print "$arr[0]";
print "$arr[1]\n";

Это работает Выход:

Hello crypted
Hello decrypted

НО main.pl

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use IPC::System::Simple qw(capture capturex);

my $cmd= 'perl xyz.pl';
my @arg=("Hello");
my @arr = capture($cmd,@arg);

print "$arr[0]";
print "$arr[1]\n";

Это не работает.Там написано "perl xyz.pl" failed to start: "The system cannot find the file specified" at main.pl line 11

1 Ответ

3 голосов
/ 19 сентября 2019

Если вы передаете только один скаляр, capture ожидает, что это будет команда оболочки.

Таким образом, capture('perl xyz.pl Hello') работает.

Если вы передаете несколько скаляров, capture ожидает, что первым будет путь к программе для выполнения.Остальные передаются как аргументы.

Таким образом, capture('perl xyz.pl', 'Hello') не работает.


Вы можете использовать

use IPC::System::Simple qw( capture );

my @cmd = ( 'perl', 'xyz.pl', 'Hello' );
capture(@cmd)

Но вы никогда не захотитеиспользуйте capture, если вы не передадите один скаляр, который является командой оболочки.Используйте capturex при передаче пути и аргументов.

use IPC::System::Simple qw( capturex );

my @cmd = ( 'perl', 'xyz.pl', 'Hello' );
capturex(@cmd)

Но предположим, что вы получили строку perl xyz.pl из другого места.Необходимо вызвать оболочку, поэтому нам нужно преобразовать аргументы в литералы оболочки.

use IPC::System::Simple qw( capture );
use String::ShellQuote  qw( shell_quote );

my $cmd = 'perl xyz.pl';
my @extra_args = 'Hello';
my $full_cmd = $cmd . ' ' . shell_quote(@extra_args);
capture($cmd)

В качестве альтернативы,

use IPC::System::Simple qw( capturex );

my $cmd = 'perl xyz.pl';
my @extra_args = 'Hello';
capturex('sh', '-c', 'eval $0 "$@"', $cmd, @extra_args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...