2017-06-05 138 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中。