2017-06-05 171 views
-6

如何逃避这些外部字符*/Perl星号*字符问题

该命令正​​在使用shell界面。

当我在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转换为shell文本,只需在其中引入单引号即可。换句话说,你有一个shell命令注入错误。修复:

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 shell命令):

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只是一个单一的“声明”:

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

不,你不应该猜测谁如果你不喜欢得到不明原因的倒票,那么不要在Stack Overflow上发帖,我每天都会收到几个,你只需要忍受它,由于显而易见的原因,投票是匿名的,试图通过投机性指责来打破这种匿名行为远比反对票本身更具破坏性。 – Borodin

+0

@Borodin。事情是我知道某个人不喜欢我,并且知道他只是因为低估了,但是,是的,你是对的,我会承认它。一旦你读了,你可以删除你的评论,如果你想,然后去除我的。 –

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中。