0

我有一个在 perl 中执行的 bash 命令,如下所示

 @args = ( "bash" , "-c",  "diff <(ssh  -o \"StrictHostKeyChecking no\" user-db01 'mysql -uuser -ppass --execute=\"show databases\"') <(ssh  -o \"StrictHostKeyChecking no\" user-db02 'mysql -uuser -ppass --execute=\"show databases\"')");
system(@args);

但这不允许我将输出获取到字符串变量。如果我用反引号执行完全相同的操作

 $cmd = "bash -c diff <(ssh  -o \"StrictHostKeyChecking no\" user-db01 'mysql -uuser -ppass --execute=\"show databases\"') <(ssh  -o \"StrictHostKeyChecking no\" user-db02 'mysql -uuser -ppass --execute=\"show databases\"')";
 my $res = `$cmd`;  

它抛出一个错误sh: -c: line 0: syntax error near unexpected token('`我该怎么做才能执行命令并在变量中获取结果?

4

1 回答 1

2

您可以使用常用的 CPAN 模块之一,例如IPC::System::Simple具有capture()方法的模块;或更有可能出现IPC::Open2

您的反引号问题是您没有引用 diff 命令,因此将其作为 bash 的参数:

BREAKS: bash -c diff <( cmd2 ) <( cmd1 )
GOOD  : bash -c "diff <( cmd2 ) <( cmd1 )"

您的代码将每个“单词”视为系统 shell 的单独参数(而不是 bash),例如,它与调用相同system("bash", "-c", "diff", " <(ssh" ...)

于 2012-08-14T13:21:28.400 回答