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 ответа:
Вы должны использовать
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
, который работает в любой оболочке.