【发布时间】:2016-04-28 11:46:15
【问题描述】:
我正在构建一个使用 Java 的 CFML 应用程序,以允许用户在 Linux 上运行 shell 命令。输入的命令通过-c 选项传递给bash。为了使 bash 扩展别名,我使用 -i 选项以交互模式运行。可以从 CommandBox REPL 测试以下行以复制行为:
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() 访问,但它也会暂停我的 CFML 引擎正在运行的主要 java 进程,并将我放在我的 shell 中。
[1]+ Stopped myBinary
[root@host]#
然后我必须运行fg 才能开始备份。我知道这与在交互模式下运行 bash 有关,但是如何避免这种行为?
我还尝试通过使用选项 -O expand_aliases 或运行 shopt -s expand_aliases 来扩展别名,但这些都没有任何影响。
【问题讨论】:
-
你可以试试
ProcessBuilder。 -
是的,我知道这一点,但是 Lucee CF 引擎围绕 runtime.exec 构建了一些不错的实用程序,可以同时处理捕获错误和输出流等,这非常好。我想让它按原样工作,但一直认为我只是在某个地方遗漏了一些简单的选项。
-
我发现了一个在末尾添加“&& exit”的hack。我再等几天,如果没有人能回答,我会把它作为解决方案发布。
标签: java linux bash shell cfml