我正在構建一個使用Java來允許用戶在Linux上運行shell命令的CFML應用程序。輸入的命令通過-c
選項傳遞給bash
。要使bash擴展別名,我使用-i
選項以交互模式運行。以下行可以從CommandBox REPL進行測試,以重複的行爲:我可以在沒有掛起主進程的情況下以Java的交互模式運行bash嗎?
CWD = createObject('java', 'java.io.File').init('/my/working/dir')
process = createObject('java', 'java.lang.Runtime').getRuntime().exec(['bash','-i','-c','ll'], javaCast('null', ''), CWD)
此執行和ll
命令的輸出可以經由process.getInputStream()
被訪問,但是它也中止主java程序,我的CFML發動機是跑進去,把我扔在我的外殼裏。
[1]+ Stopped myBinary
[[email protected]]#
然後我必須運行fg
開始備份。我知道這與在交互模式下運行bash
有關,但是如何避免此行爲?
我也嘗試通過使用選項-O expand_aliases
或運行shopt -s expand_aliases
來擴展別名,但這兩者都沒有任何影響。
你可以試試['ProcessBuilder'](https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html)。 –
是的,我意識到這一點,但盧西CF引擎有一些不錯的實用程序圍繞runtime.exec構建,它處理併發捕獲錯誤和輸出流等,這真是太好了。我想讓它按原樣運行,但請始終認爲我只是在某處丟失了一些簡單的選項。 –
我發現一個黑客添加「&&退出」到最後。我會再提供幾天,如果沒有人能回答,我會將其作爲解決方案發布。 –