如何逃避这些外部字符*/
?
此命令正在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 (*)
答案 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'`;