2016-07-05 67 views
1

當我試圖運行AnsibleRuntime.getRuntime().exec與Java我可以獲得Java Runtime.getRuntime()。exec的真正完全執行的命令嗎?

這裏是我做過什麼:

String[] cmd = {"ansible-playbook", "/path/to/playbook", "--extra-vars", "'{\"filePath\":\"/path/to/file\"}'"}; 
Process process = Runtime.getRuntime().exec(cmd, null); 

我得到了這樣的錯誤消息:

FAILED! => {"failed": true, "msg": "'filePath' is undefined"} 

然而,當我執行與終端相同的命令:

ansible-playbook /path/to/playbook --extra-vars '{"filePath":"/path/to/file"}' 

一切都很好...

我認爲,我在終端和Java中運行的命令,可能是撇號或引號之間必須有一些差異?

我想知道有沒有什麼辦法可以得到真正執行的命令Runtime.getRuntime().exec?就像我可以得到由history一些用戶的命令行歷史...

+1

你不需要第三個參數中的單引號:exec命令爲你「引用」它。 '「{\」filePath \「:\」/ path/to/file \「}」'很好。 –

+0

@AndyTurner謝謝!爲什麼單引號版本在終端上工作... – kaze13

+0

因爲終端不會爲您引用它。 –

回答

1

你在你的第三個參數添加額外的報價:

"'{\"filePath\":\"/path/to/file\"}'" 

如果你這樣做,你不執行相同的命令如上所述。你其實(在bash)執行:

ansible-playbook /path/to/playbook --extra-vars ''\''{"filePath":"/path/to/file"}'\''' 

你不需要在這裏值的單引號:因爲你直接傳遞這些價值,你不必擔心報價是你必須做一個shell。你可以簡單地使用:

"{\"filePath\":\"/path/to/file\"}" 
相關問題