sh:1:语法错误:使用反引号perl时出现意外重定向

时间:2015-03-20 12:47:05

标签: bash perl backticks

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`;

我正在使用上面的代码从我的perl脚本安装mysql。但是我收到了这个错误

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

似乎纠正并在shell中手动执行此命令会产生所需的输出。但是当执行perl脚本时,它会给出错误。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

perl使用/bin/sh来执行命令。尝试将该字符串提供给sh,如果出现相同的错误则是问题。

如果要使用bash执行该语句,请使用bash -c "cmd args ..."作为命令。

如果您只需要将一行传递给命令,那么避免使用<<<的非可移植基础可能是个好主意。相反,使用适用于任何shell的echo "whatever" | command

答案 1 :(得分: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: $?";

主要原因是您不想处理引用问题和不兼容性等问题。