2015-03-20 2 views
2
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: Синтаксическая ошибка: перенаправление неожиданно при использовании backticks 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 он дает ошибку. Есть идеи?

ответ

1

Вы должны использовать 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: $?"; 

Основная причина вам не нравится иметь дело с экранированием вопросов и несовместимостей и так далее.

+1

Это смехотворно неэлегантное решение простой проблемы. Уч. – tpartee

+0

@tpartee: Я ожидаю, что кто-то со своим опытом оценят надежность и безопасность решения. Какой позор. –

5

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

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

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

+0

Такая же ошибка 'Синтаксическая ошибка: перенаправление неожиданно' – Harikrishnan

Смежные вопросы