Извините, это довольно просто, и я подозреваю дубликат, но после некоторых поисков я выхожу пустым:
С учетом следующего скрипта:
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Run3;
my $stdout2;
print $ARGV[0];
print "\n";
my @cmd1 = split /\s+/, $ARGV[0] ;
run3 (\@cmd1, \undef, \$stdout2, \$stdout2);
print $stdout2
И работает так:
£ perl comp.pl "md5sum *(.)"
md5sum *(.)
md5sum: '*(.)': No such file or directory
Достаточно справедливо. Оболочка *(.)
не интерпретируется оболочкой, и, вероятно, большинство сочтет это функцией. Но я бы хотел, чтобы это интерпретировалось текущей оболочкой (или zsh
определенно подойдет).
Вопрос в том, как я могу сделать это без усложнения команды оболочки для запуска сценария perl.
С добавлением "zsh"
и "-c"
к cmd1
все в порядке, если это разумный способ сделать это. Просто кажется, что это не так.
Мое намерение также состоит в том, чтобы в конце концов передать немного более сложные команды этому скрипту, например:
perl comp.pl 'md5sum *(.)' 'ssh remoteHost "md5sum *(.)"'
У меня нет возражений против не-Perl ответов на проблему, которую вы, вероятно, можете понять, которую я пытаюсь решить (я подозреваю, что rsync
может сделать это), но я в первую очередь заинтересован в решении этого через Perl, так как в конечном счете, в этом сравнении будет логика, специфичная для бизнеса.
EDIT
Я пробовал различные формы:
my $cmd = $ARGV[0];
run3 (\$cmd, \undef, \$stdout2, \$stdout2);
документация, кажется, думает, что это будет хорошо, но я получаю:
Not an ARRAY reference at /usr/local/share/perl/5.22.1/IPC/Run3.pm line 320.