我正在构建一个使用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构建,它处理并发捕获错误和输出流等,这真是太好了。我想让它按原样运行,但请始终认为我只是在某处丢失了一些简单的选项。 –
我发现一个黑客添加“&&退出”到最后。我会再提供几天,如果没有人能回答,我会将其作为解决方案发布。 –