2010-03-03 43 views
5

bash外殼上的Linux引號:EXEC ARGS(值)由Ant腳本

./mimic_cmd "startDaemon()" 

通訊螞蟻代碼:

<exec failonerror="true" executable="/bin/mimic_cmd"> 
    <arg value='"startDaemon()"' /> 
</exec> 
  1. 是否螞蟻代碼恰好在bash中表示上述命令貝殼?根據調試信息,它看起來像它:
[exec] Executing '/bin/mimic_cmd' with arguments: 
[exec] '"startDaemon()"' 
[exec] 
[exec] The ' characters around the executable and arguments are 
[exec] not part of the command. 
Execute:Java13CommandLauncher: Executing '/bin/mimic_cmd' with arguments: 
'"startDaemon()"' 
The ' characters around the executable and arguments are not part of the command. 

然而,1,而在Bash shell命令返回0

繃vmlauncher沒有按螞蟻的代碼返回和退出代碼沒有幫助,路徑都是正確的。

相同的螞蟻代碼適用於Windows與生成的調試輸出:

[exec] Executing 'C:\bin\mimic_cmd' with arguments: 
[exec] '"startDaemon()"' 
[exec] 
[exec] The ' characters around the executable and arguments are 
[exec] not part of the command. 
Execute:Java13CommandLauncher: Executing 'C:\bin\mimic_cmd' with arguments: 
'"startDaemon()"' 
The ' characters around the executable and arguments are not part of the command. 

回答

8

你能告訴我們什麼mimic_cmd是什麼? (它是一個ELF可執行文件,它是一個腳本 - ?如果是這樣,什麼是它的內容)

不需要也不想要你的ANT XML屬性(內雙引號順便說一句,因爲它爲格式良好的XML,您應該將它們寫爲&quot;而不是",但是這不會影響討論),除非您的可執行文件期望它們。爲以下任一(100%當量)的外殼命令線的對應ANT代碼:

./mimic_cmd "startDaemon()" 
    ./mimic_cmd 'startDaemon()' 
    ./mimic_cmd startDaemon\(\) 
    ./mimic_cmd startDaemon"()" 
    ./mimic_cmd startDaemon'()' 

...實際上是:

<exec failonerror="true" executable="/bin/mimic_cmd"> 
     <arg value="startDaemon()" /> 
    </exec> 

...或者,爲了說明的目的:

<!-- spawn a shell with your original command line --> 
    <exec failonerror="true" executable="/bin/sh"> 
     <arg value="-c" /> 
     <arg value="/bin/mimic_cmd &quot;startDaemon()&quot;" /> 
    </exec> 

爲什麼這麼長時間解釋;可以說,在你的具體情況下,唯一一次你不得不使用雙引號時,最終通過* nix shell發出命令(交互地或作爲另一個腳本的一部分或編程方式通過execsh -c),並且只是爲了讓那個殼不會認爲圓形包子()具有特殊含義。當shell反過來產生mimic_cmd時,它已經剝去了雙引號(並且替換了反斜槓轉義的序列等等 - 見how a *nix shell parses its command line),ANT不會通過shell運行你的命令,而是直接執行它,所以在這個案件mimic_cmd發現自己的手上有一堆雙引號,它顯然不知道如何處理。

你基本上必須把它看作是用XML轉義和替換爲<arg/>標籤替換所有形式的shell引用和轉義。

Windows的CMD.EXE是在這,unline * nix的外殼,它的最小解析(一般不關心在程序參數雙引號)感special,留給了程序弄清楚你的意思引用。(這實際上是Windows'CreateProcess的一個硬性限制,其中does not have the notion of argv[],以每個程序爲準,以它認爲合適的方式解釋lpCommandLine;有些會爲您排除引號,但該行爲是非常不一致的,例如問題echo "bla"CMD.EXE提示符下查看CMD.EXE的內置函數對引用的看法。)同樣,對於您的情況,圓括號()對於CMD.EXE沒有任何意義,所以即使在命令提示符處鍵入命令時也不需要它們。至於ANT,在Windows和* nix平臺上,它通過CreateProcess而不是CMD.EXE來傳遞mimic_cmd,所以你不想引用任何東西。

+0

mimic_cmd是跨平臺安裝解決方案的shell可執行文件。我不參與開發它的內部團隊,所以老實說,我不能說是否總是需要引號,但有些命令似乎需要它們,或者在括號之前必須有一個空格? 'mimic_cmd StartDaemon()'在ANT和命令行(不包括引號,空格)中不起作用 'mimic_cmd createNewWorkspace(blah)'不帶引號根本不起作用; ''「mimic_cmd createNewWorkspace(blah)」'在Windows上運行,但不能運行在linux上,'mimic_cmd createNewWorkSpace(blah)'同時運行在...(括號之前的空格) – Michael 2010-03-04 00:24:33

+0

嗯......小心那些不帶引號* nix,他們可能正在做一些背後的事情,你不希望......輸入'/ bin/mimic_cmd「createNewWorkspace(blah)」'在* nix命令行上工作嗎?如果是這樣的話,那麼在ANT中''exec failonerror =「true」executable =「/ bin/mimic_cmd」>「如果'blah'本身就是一個字符串,它會變得更有趣:'/ bin/mimic_cmd「createNewWorkspace(\」blah \「)」'或'/ bin/mimic_cmd'createNewWorkspace(「blah」)'' ,在ANT中,'... ...' – vladr 2010-03-04 00:48:27