使用org.apache.commons.exec.DefaultExecutor执行shell命令

时间:2014-04-03 17:00:46

标签: java apache shell

我想在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);

2 个答案:

答案 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按原样执行命令。