执行bash命令并捕获输出

时间:2012-08-14 13:16:37

标签: perl

我有一个bash命令我在perl中执行如下

 @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(&#39;`我该怎么做才能执行命令并将结果输入变量?

1 个答案:

答案 0 :(得分:2)

您可以使用常用的CPAN模块之一,例如IPC::System::Simple具有capture()方法的IPC::Open2;或者更有可能存在的{{3}}。

你的backticsk问题是你没有引用diff命令,因此把它作为bash的参数:

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

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

相同