2017-06-05 11 views
-6

どのようにこれらの外字をエスケープできますか*/Perlアスタリスク*文字の問題

このコマンドはシェル画面で動作しています。

私はPerlスクリプトでそれを追加すると*文字が壊れコマンドです:

my $sonar = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner -Dsonar.host.url=http://sonarqubesonar.com:9000 -Dsonar.projectKey=codeAnalysis.test50 -Dsonar.sourceEncoding=Cp1252 -Dsonar.projectBaseDir='/vob/test/test' -Dsonar.sources='/vob/test/test/app/,/vob/test/test/src' -Dsonar.projectName='test50' -Dsonar.java.binaries='/vob/test/test/**/*.jar' "; 

これは、それが呼ばれる方法です。

my $cmd = " csh -c '$sonar '"; 
print "cmd\n"; 
my $result = system("($cmd) >> /logs/on.txt 2>&1"); 

私は取得していますエラーは次のとおりです。あまりにも多くの引用符がここにありますように

Dsonar.java.binaries='/vob/test/test/**/*.jar' "; this variable is broken (*)

+1

そのPerlステートメントは問題ありません。アスタリスクはあなたが置いた場所に残ります。 – Borodin

+0

何がうまくいかないのですか?どのようにこの変数を使用していますか。あなたはそれが「壊れている」と思うようになっていますか? – Sobrique

+0

一般的に、Perlではバックスラッシュ\がエスケープ文字ですが、この行はうまくいくようです。 – sniperd

答えて

1

-cの引数をシェルリテラルに変換するのは、単引用符を置くだけです。つまり、シェルコマンドのインジェクションのバグがあります。修正:

use String::ShellQuote qw(shell_quote); 

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ..."; 
my $outer_cmd = shell_quote('csh', '-c', $sonar_cmd) . ' >/logs/on.txt 2>&1'; 
system($outer_cmd); 

なぜ、cshを使用していますか。あなたは、そのシェルを避け、そしてそれはあなたが($sonar_cmdが有効なBourneシェルコマンドであることを考えると)以下を使用することができます回避する必要があります。

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ..."; 
my $outer_cmd = "($sonar_cmd) /logs/on.txt 2>&1"; 
system($outer_cmd); 

$sonar_cmdは1つだけ「文」であれば、以下も動作します:

my $sonar_cmd = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner ..."; 
$sonar_cmd .= ' /logs/on.txt 2>&1'; 
system($sonar_cmd); 
-1

は思えます。一重引用符の一部を削除しないでください。コードをエディタにコピーすると、unquoted string 'vob'unquoted string 'test'のエラーが発生します。だから、おそらく我々は$cmd作成に2つの単一引用符を取り除く:

my $cmd = "csh -c $sonar"; 

あなたは改行で単語cmdを印刷している理由はありますか?または実際に$cmdを印刷したいですか?

print "$cmd\n"; 

また、あなたが別途cmdを呼び出す必要はありませんどこダニが、私はあなたのスクリプトの残りの部分が何をするか分からないので、これは単なるサイドノートで戻って考えることができます。

my $sonar = `csh -c /opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner -Dsonar.host.url=http://sonarqubesonar.com:9000 -Dsonar.projectKey=codeAnalysis.test50 -Dsonar.sourceEncoding=Cp1252 -Dsonar.projectBaseDir='/vob/test/test' -Dsonar.sources='/vob/test/test/app/,/vob/test/test/src' -Dsonar.projectName='test50' -Dsonar.java.binaries='/vob/test/test/**/*.jar'`; 
+0

いいえ、あなたは誰を推測すべきではありません。説明がない票は、スタックオーバーフローには投稿されません。私は毎日何回か取得しますが、あなたはそれに気を付けるだけです。投票は明白な理由で匿名です。投機的告発によってその匿名を破るのをやめようとすることは、下院議員自身よりもはるかに有害である。 – Borodin

+0

@ボロディン。私は、私が好きではないと思う人を知っています。なぜなら、彼がダウンした理由は分かっているのですが、確かにそうです。あなたが読んだら、あなたが望むならあなたのコメントを削除することができます、その後、私を削除するつもりです。 –

0
my $sonar = "/opt/tools/wh/dtd/tools/sonar/sonar-runner-2.4/bin/sonar-runner -Dsonar.host.url=http://sonarqubesonar.com:9000 -Dsonar.projectKey=codeAnalysis.test50 -Dsonar.sourceEncoding=Cp1252 -Dsonar.projectBaseDir='/vob/test/test' -Dsonar.sources='/vob/test/test/app/,/vob/test/test/src' -Dsonar.projectName='test50' -Dsonar.java.binaries='/vob/test/test/**/*.jar' "; 

これは、それが呼ばれる方法です。

my $cmd = " csh -c '$sonar '"; 
print "cmd\n"; 
my $result = system("($cmd) >> /logs/on.txt 2>&1"); 

あなたの問題は、ここでは「単なる」入れ子になっている引用符が多すぎると思います。

文字列にシングルクォート(-Dsonar.java.binaries='/vob/test/test/**/*.jar')とシングル引用符($cmd)があります。