私のperlスクリプトでは、このコード:
system("ssh -q ullink\@130.45.56.217 \"echo 1 2|awk '{print \$2}'\"");
awk の部分が機能しません。期待される結果は「1」ですが、現在は「1 2」になっています。どうすればうまくいくのかわかりませんか?
awk
リモートホストで実行するかローカルで実行するかに関係なく、どこにも行かない出力が生成されます。 system()
実行したコマンドの出力は表示されず、戻りステータスのみが表示されます。
更新: はい、システムによって実行されるコマンドは、STDOUT に出力できます。
代わりに逆引用符が必要です。
my @output = `command here`;
print @output;
また、Perl でできることはほとんど何でもできることを覚えておいてくださいawk
。Perl でできるだけ多くの処理を行い、外部システム コマンドを最小限に抑えたいと考えています。しかし、これはあなたが何をしているかに依存し、ある程度個人的な好みです.
なぜリモートホストで実行awk
するのですか、またはまったく実行しないのですか?
system(qq(ssh -q $UL_SERVER_LOGIN\@$UL_SERVER echo 1 2 | awk '{print $2}'));
またはさらに良い
print ((split (/\s+/,qx(ssh -q $UL_SERVER_LOGIN\@$UL_SERVER echo 1 2)))[1]);
スクリプトの具体的な問題は、ドル記号にさらに多くのエスケープが必要なことです。リモート シェルによって食べられてしまいます。しかし、バックスラッシュを使用してリモート シェルからエスケープする場合は、バックスラッシュを Perl などからエスケープする必要があります。可能な場合は単一引用符を使用すると、はるかに簡単になります。
system("ssh -q $UL_SERVER_LOGIN\@$UL_SERVER " .
'"echo 1 2 | awk \'{ print \$2 }\'"');