首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用org.apache.commons.exec.DefaultExecutor执行shell命令

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

Stack Overflow用户
提问于 2014-04-03 17:00:46
回答 2查看 3.9K关注 0票数 3

我想在java代码中执行这样的命令,

代码语言:javascript
复制
gzip -c /tmp/specificPreffix_2013-11-06.txt > /tmp/specificPreffix_2013-11-06.txt.gz

我的系统是RHEL5,我已经授予了文件访问权限。

当我使用开源org.apache.commons.exec.DefaultExecutor时,它不起作用。有谁能帮我指出为什么会这样,或者让我知道是否有别的办法。提前谢谢。

您可以了解我的用法如下:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-08 11:58:41

大卫的正确答案,在评论中。

代码语言:javascript
复制
Runtime.getRuntime().exec(new String[]{"sh","-c","gzip -c /tmp/specificPreffix_2013-11-06.txt > /tmp/specificPreffix_2013-11-06.txt.gz",});
票数 0
EN

Stack Overflow用户

发布于 2016-12-15 08:19:56

代码语言:javascript
复制
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字符串:如果存在-c选项,则从string读取命令。如果字符串后面有参数,则将它们分配给位置参数,从$0开始。

这允许我们将shell命令序列作为“参数”传递,这使commons.exec很高兴。最后,false参数在addArgument(...)中告诉commons.exec接受实际的命令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22844268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档