我想在java代码中执行这样的命令,
gzip -c /tmp/specificPreffix_2013-11-06.txt > /tmp/specificPreffix_2013-11-06.txt.gz
我的系统是RHEL5,我已授予文件访问权限。
当我使用开源org.apache.commons.exec.DefaultExecutor时,它不起作用。 任何人都可以帮助指出为什么会发生这种情况,或者让我知道是否有另一种方式。 提前谢谢。
您可以按以下方式使用我的用法:
CommandLine cmd = new CommandLine("gzip").addArgument("-c").addArgument("/tmp/specificPreffix_2013-11-06.txt").addArgument(">").addArgument("/tmp/specificPreffix_2013-11-06.txt.gz");
OutputStream outputStream = new ByteArrayOutputStream();
DefaultExecutor exec = new DefaultExecutor();
exec.setWatchdog(new ExecuteWatchdog(timeoutInMilliSeconds));
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setStreamHandler(streamHandler);
exec.execute(cmd);
答案 0 :(得分:0)
大卫@在评论中的正确答案。
Runtime.getRuntime().exec(new String[]{"sh","-c","gzip -c /tmp/specificPreffix_2013-11-06.txt > /tmp/specificPreffix_2013-11-06.txt.gz",});
答案 1 :(得分:0)
String myActualCommand =
"gzip -c /tmp/specificPreffix_2013-11-06.txt > /tmp/specificPreffix_2013-11-06.txt.gz";
// able to execute arbitrary shell command sequence
CommandLine shellCommand = new CommandLine("sh").addArgument("-c");
// set handleQuoting = false so our command is taken as it is
shellCommand.addArgument(myActualCommand, false);
Executor exec = new DefaultExecutor();
// ... (configure the executor as you like, e.g. with watchdog and stream handler)
exec.execute(shellCommand);
commons.exec期望CommadnLine
对象只表示一个带有此命令参数的命令。例如。 echo 'hello world!'
很好,但echo 'hello world!' > hello.txt
在没有我上面显示的解决方法的情况下无法工作。
了解解决方法
sh -c
将带有任意shell命令的字符串作为"参数"并执行那些。从bash手册页:
-c string:如果存在-c选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置 参数,以$ 0开头。
这允许我们将shell命令序列作为"参数"传递,使commons.exec满意。最后,false
中的addArgument(...)
参数告诉commons.exec按原样执行命令。