2011-12-09 18 views
0

私は、bashシェルの大きな引数リストを持つperlスクリプトからperlスクリプトを呼び出したいと思っています。引数には、\*()などの特殊文字が含まれています。これらの特殊文字はそれぞれ単一のエスケープ文字\によって案内されます。perlスクリプトからperlスクリプトを呼び出す

しかし、第1のperlスクリプトから2番目のperlスクリプト(シェルスクリプトを呼び出します)を呼び出すと、エスケープ文字が評価され、特殊文字がシェルで公開され、構文エラーが発生します。

基本的に私は第1のperlスクリプトから2番目のperlスクリプトを呼び出すときにエスケープ文字の評価をしないようにしたいのですが、2番目のperlスクリプトからシェルスクリプトを呼び出すときに評価する必要があります。

例:あなたがそれらを複数の要素を持つリストを渡すと

MonitorAdmin -reversefilter -container="LogServerContainer" -filepath="/home/esg2/YogeshTemp/VSDEFAULT/logs" -filename="System.log" -pattern=".*\t.*\t(DEBUG)\t.*\t.*\t.*\t(SecurityService)\t.*\t.*\t.*\t.*\t.*" -linecount="5001" -targetfile=" 
+0

私は、MonitorAdminスクリプトに与えられた引数に別のエスケープ文字を追加しないでください。 – Yogesh

+1

バグのあるコードを修正してください。 – ikegami

答えて

1

systemの2つの形式があり、シェルコマンド(system($shell_cmd))を実行するものと、プログラム(system($program, @args))を起動するものがあります。軽い投稿では、間違ったものを使っているようです。必要なのは

system('MonitorAdmin2', @ARGV) 

文字を誤って解釈するシェルはありません。

+0

はい、これは特殊文字に関する問題を解決するように見えますが、今や別の問題に直面しています。 MonitorAdminコマンドに@ARGVリストとともにいくつかの引数を渡したいと思います。このような「システム」コマンドの中で私はどのようにしてやるのだろうか? – Yogesh

+0

@ Yogesh、それは配列である必要はなく、 '@ ARGV'ははるかに少なくなります。適切なリストを返す式を作成するだけです。 – ikegami

+0

助けてくれてありがとう、本当に助けになった。 – Yogesh

2

Perlのexecsystemコマンドはシェルを起動しませんが、各リスト要素は、別々の引数になり:「MonitorAdmin」スクリプト最初のperlに入力されますつまり、スペースは引数を区切りません。私は-cオプションでshallを起動していないので、シェルスクリプトを実行してもうまく動作すると思います。

+0

ここには3つの層が含まれています。最初の呼び出しは、system "bash"、 "-fc"、 "2ndPerlScript @ARGV"のような別のperlスクリプトを実行するMonitorAdmin perlスクリプトに行き、次にこの2番目のperlスクリプトは、 getoptionsの助けを借りて、次のようなシェルスクリプトに伝播します:system "bash"、 "-fc"、 "ShellScriptName $ ARGUMENT_LIST" – Yogesh

+0

しかし、問題は、後続の呼び出しで@ARGVリストを渡すと、評価される。 – Yogesh

関連する問題