RedHat Linux命令输出重定向在Java Process中失效的技术问询
问题解决:Java执行带重定向的Linux命令失效
问题原因
Java的Runtime.exec()方法不会像Linux Shell那样解析命令中的重定向符号(比如&>)。当你直接传入"mycommand &> mycommand.log"时,exec()会把&>和mycommand.log当作mycommand的命令行参数,而非执行输出重定向操作,所以输出依然会打印到STDOUT。
解决方案
要让重定向生效,必须通过Linux Shell来执行整个命令,让Shell负责解析重定向语法。有两种实现方式:
方式1:将命令作为参数传给bash
直接构造调用bash的命令,用-c参数指定要执行的命令字符串:
String command = "/bin/bash -c 'mycommand &> mycommand.log'"; Process.getRuntime().exec(command);
如果需要用双引号包裹命令内容,注意转义Java字符串中的双引号:
String command = "/bin/bash -c \"mycommand &> mycommand.log\""; Process.getRuntime().exec(command);
方式2:拆分命令参数(推荐)
把bash路径、-c参数和目标命令分开成字符串数组,避免引号转义的问题,更安全可靠:
Process.getRuntime().exec(new String[]{ "/bin/bash", "-c", "mycommand &> mycommand.log" });
原理说明
通过调用/bin/bash -c "命令",相当于让bash进程作为父进程执行目标命令,此时bash会正常解析命令中的&>符号,将mycommand的标准输出(STDOUT)和标准错误(STDERR)都重定向到mycommand.log文件中,达到和直接在Shell执行一致的效果。
内容的提问来源于stack exchange,提问作者codebee
相关产品推荐
相关产品推荐

