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

メソッドIPC::System::Simpleを持つ通常の CPAN モジュールの 1 つを使用できます。capture()または存在する可能性が高いIPC::Open2.

バックティックの問題は、diff コマンドを引用しなかったため、bash の引数になっていることです。

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

あなたのコードは、すべての「単語」をシステム シェル (bash ではなく) への個別の引数として扱います。たとえば、呼び出しと同じです。system("bash", "-c", "diff", " <(ssh" ...)

于 2012-08-14T13:21:28.400 に答える