执行bash命令和捕获输出

问题描述:

我有我在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); 

但这并不能让我得到的输出给一个字符串变量bash命令。 如果我执行与反引号

$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('`我能做些什么来执行命令,并在一个变量得到的结果?

+1

什么是示例代码和反引号的确切错误? – DVK 2012-08-14 13:19:28

+0

编辑成问题 – Aks 2012-08-14 13:23:01

可以使用的一个确切samething通常CPAN模块,如IPC::System::Simple具有capture()方法;或者更可能将要存在的IPC::Open2

你backticsk问题是,你并没有引述diff命令,从而使它成为一个争论打坏。 :

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

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

+0

当我做一个$ cmd =“cmd”然后反引用$ cmd'时,cmd中的双引号引起问题,即使它们被转义出来 – Aks 2012-08-14 13:29:48

+0

@Aks - 最有可能你需要逃避转义。一个非常恼人的练习,所以你应该看看我的答案CPAN选项。 – DVK 2012-08-14 13:32:46

+0

我会那样做的。谢谢 – Aks 2012-08-14 13:34:37