Perl星号*字符问题

时间:2017-06-05 12:31:50

标签: perl shell sh quoting

如何逃避这些外部字符*/

此命令正在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 (*)

3 个答案:

答案 0 :(得分: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 ?!您应该避免使用该shell,并且避免它允许您使用以下内容(假设$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 :(得分:0)

accept (and use the app)

这就是它的召唤方式。

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'中的单引号。

答案 2 :(得分:-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'`;