【问题标题】:Perl asterisk * character issue [closed]Perl星号*字符问题[关闭]
【发布时间】:2017-11-06 05:32:49
【问题描述】:

我怎样才能逃脱这些外部字符*/

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

【问题讨论】:

  • Perl 语句很好。星号将保留在您放置它们的位置。
  • 什么不起作用?你是如何使用这个变量的。是什么让你觉得它“坏了”?
  • 一般来说,对于 Perl 来说,反斜杠 \ 是转义字符,尽管这一行看起来可以正常工作。
  • Dsonar.java.binaries='/vob/test/test/**/*.jar' "; 这个变量坏了(星号)
  • 不要在 cmets 中添加重要的细节。请edit your question 包含这些内容。

标签: perl shell sh quoting


【解决方案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);

【讨论】:

    【解决方案2】:
    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 中有单引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2023-03-15
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多