sh: 1: синтаксическая ошибка: перенаправление неожиданно при использовании backticks perl


my $mysql_cmd = 'debconf-set-selections <<< 'mysql-server mysql-server/root_password password 6ygr' ;debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password 6ygr'; '.our $install_cmd." mysql-server";
my $mysql_stat = `$mysql_cmd`;

Я использую приведенный выше фрагмент кода для установки mysql из моего скрипта perl. Но я получаю эту ошибку

sh: 1: Syntax error: redirection unexpected

Когда я напечатал $mysql_cmd я получил debconf-set-selections <<< 'mysql-server mysql-server/root_password password 6ygr' ;debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password 6ygr'; apt-get -y install mysql-server

, который, кажется, исправляет и вручную выполняет эту команду в оболочке, дает желаемый результат. Но при выполнении скрипта perl он выдает ошибку. Есть идеи?

2 2

2 ответа:

Вы должны использовать IPC::Run для такого рода работ

use IPC::Run qw(run);
my @options = map "mysql-server mysql-server/$_ password 6ygr",
    qw(root_password root_password_again);
my $mysql_stat;
run [qw(debconf-set-selections)], '<', \$_, '>>', \$mysql_stat, '2>>', \$mysql_stat
    or die "debconf-set-selections: $?"
    for @options;
run [ $install_cmd, 'mysql-server' ], '>>', \$mysql_stat, '2>>', \$mysql_stat
    or die "$install_cmd: $?";

Основная причина в том, что вы не любите иметь дело с проблемами цитирования и несовместимостью и так далее.

Perl использует /bin/sh для выполнения команд. Попробуйте передать эту строку в sh, и если вы получите ту же ошибку, что и проблема.

Если вы хотите использовать bash для выполнения этого оператора, используйте bash -c "cmd args ..." в качестве команды.

Если вам нужно передать только одну строку в команду, может быть хорошей идеей избежать непереносимого башизма <<<. Вместо этого используйте echo "whatever" | command, который работает в любой оболочке.