`
dch1287
  • 浏览: 123295 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

JAVA调用shell命令时重定向、管道时遇到的问题

    博客分类:
  • Java
阅读更多
用java在Linux环境下执行shell命令,可以使用如下方法:

import java.io.IOException;
public class JavaShell
{
        /**
         * @param args
         * @throws IOException
         * @throws InterruptedException
         */
        public static void main(String[] args) throws IOException, InterruptedException
        {
                Process p;
                p = Runtime.getRuntime().exec("md5sum a.c > a.c.md5"});
                if(0==p.waitFor())
                {
                        System.out.println("Command execute result is OK!");
                }
                else
                {
                        System.out.println("Command execute result is fail......");
                }
        }
}


但上述程序执行起来是有问题的。程序运行后,并没有正确的生成.md5文件。Runtime.getRuntime().exec的执行结果都是非0。出现这种错误的原因是因为 额外的参数(">") 被直接传送到了md5sum命令而不是送到实际的命令行。
解决这一问题的办法是将cmd串弄成一个字符串数组,并且将你想运行的程序传送到命令shell。如下面的程序所示:

import java.io.IOException;
public class JavaShell
{
        /**
         * @param args
         * @throws IOException
         * @throws InterruptedException
         */
        public static void main(String[] args) throws IOException, InterruptedException
        {
                Process p;
                p = Runtime.getRuntime().exec(new String[]{"sh","-c","md5sum a.c > a.c.md5"});
                if(0==p.waitFor())
                {
                        System.out.println("Command execute result is OK!");
                }
                else
                {
                        System.out.println("Command execute result is fail......");
                }
        }
}


Reference:
http://hi.baidu.com/litertiger/blog/item/822a7ef049c913d47831aa19.html
http://blog.csdn.net/georgejin/archive/2010/10/13/5937877.aspx
http://hi.baidu.com/zhangtianshun/blog/item/ae632246b572b40e6a63e579.html

转自:http://www.liaoqiqi.com/blog/2011/java-call-shell-command-redirection-pipeline-problems/
分享到:
评论

相关推荐

    利用Python+Java调用Shell脚本时的死锁陷阱详解

    本文将详细探讨如何使用Python和Java调用Shell脚本,并着重讲解在调用过程中可能出现的死锁问题及其解决策略。 首先,Python提供了`subprocess`库来执行外部命令,包括Shell脚本。在Python 3.5之后,`subprocess....

    调用外部命令.rar

    8. **安全考虑**:调用外部命令时要注意权限和安全问题,避免执行未经验证的用户输入,防止命令注入攻击。例如,不要直接拼接用户输入到命令字符串中,而是使用参数化的方式传递。 9. **异步调用**:在某些情况下,...

    shell shell java c c++

    根据提供的标题、描述以及部分内容,我们可以看出这是一篇与编程语言相关的文章,主要涉及Shell、Java、C 和 C++ 四种编程语言。虽然提供的文本内容并不具备实际意义,但基于这些关键词,我们可以构建出一系列关于这...

    串口编程,java串口编程,Shell

    在Shell编程中,学习使用管道、重定向和控制流程命令来实现串口通信的控制逻辑。 总之,这个压缩包提供了从底层驱动到应用层的串口编程实例,对于想要深入理解Linux环境下串口通信的开发者来说,是一份非常有价值的...

    JAVA过滤器标准代码

    总之,JAVA过滤器作为Java Web开发中的一个重要组成部分,提供了强大的功能和灵活性,可以用于解决多种实际问题,包括但不限于编码处理、权限验证、日志记录、异常处理、数据格式转换和缓存优化等。理解和掌握过滤器...

    Linux命令解释器的设计本科毕业论文.doc

    Shell 的实现需要支持管道操作,如重定向、追加等。 8. 作业控制命令 Shell 的实现需要支持作业控制命令,如 fg、bg 等。 Linux 命令解释器的设计是一个复杂的过程,涉及到操作系统、计算机网络、编程语言等多...

    Linux下Shell编程实例

    9. **重定向和管道**:`>`用于输出重定向,`用于输入重定向,`|`用于管道,将一个命令的输出作为另一个命令的输入。 10. **脚本执行权限**:通过`chmod +x script.sh`赋予脚本执行权限,使其能被运行。 了解并熟练...

    shell编程大全

    - `|`:管道,将一个命令的输出作为另一个命令的输入。 7. **数组** - Bash从4.0版本开始支持数组,如`my_array=("apple" "banana" "cherry")`。 - 访问数组元素使用 `${my_array[0]}`。 8. **函数** - 定义...

    shell脚本常见操作.pdf

    请注意,使用此命令时务必小心,因为删除操作无法撤销。 **5. 查看文件内容** - **命令**: `cat filename` - **说明**: `cat`命令可以用来显示文件内容。如果文件较大,建议使用`less`或`more`命令分页查看。 **6...

    Python-closh基于Clojure的类似于Bash的shell

    在实际使用中,Python-closh提供了与Bash相似的语法,如管道(pipe)和重定向(redirect),使得Clojure表达式可以与其他命令串联,形成强大的命令链。这对于那些习惯于Bash但希望利用Clojure能力的开发者来说,降低...

    高级UNIX编程 pdf 电子书

    6.5 非重定向管道的双向通信 6.6 用双向管道进行双向通信 练习 第7章 高级进程间通信 7.1 概述 7.2 FIFO或命名管道 7.3 抽象的简单消息接口(sMI) 7.4 SystemVIPC 7.5 System V消息队列 7.6 POSIX IPC 7.7 POSIX消息...

    MyShell:这是一个演示命令提示符或 shell 在计算机中工作的程序

    3. **管道和重定向**:允许用户将一个命令的输出作为另一个命令的输入,或者将命令的输出重定向到文件。 4. **脚本编写**:Shell 支持编写包含一系列命令的脚本,以实现自动化任务。 5. **环境变量管理**:设置和...

    linux基本命令

    管道`|`用于将一个命令的输出作为另一个命令的输入;重定向`>`和`>>`用于改变命令的标准输出位置等。 #### 文本编辑器 在Linux中,掌握至少一种文本编辑器是非常重要的,常用的文本编辑器包括: - **vi/vim**:...

    linux学习资料大全

    - 输入/输出重定向(>`)和管道(|)。 - 脚本控制结构,如case和until。 - 常用的shell内置命令,如`echo`、`read`、`source`。 编写shell脚本可以大大提高工作效率,尤其是在执行重复性任务时。 3. **Unix...

    执行外部程序.rar

    当需要与外部程序交换数据时,可以使用管道、重定向、套接字或其他IPC机制。 总结,执行外部程序是编程中不可或缺的一部分,涉及到各种操作系统、编程语言和安全实践。理解这些知识点有助于编写更健壮、安全的代码...

    osHelper

    9. **Shell编程接口**:如果osHelper是一个库,那么需要理解如何在其他编程语言中调用Shell命令,例如Python的subprocess模块或Java的Runtime类。 10. **版本控制**:如果是Git仓库,需要知道如何克隆、拉取、提交...

    达内培训笔记(Core Java,C++,UniX)

    4. **管道和重定向**:允许命令之间的连接和数据流动,以及输入/输出的重定向。 5. **进程管理**:包括进程创建、通信、同步和调度。 6. **权限和用户组**:Unix有严格的权限系统,通过用户ID和组ID控制文件访问。...

    操作系统讲义【李胜利版】

    它支持命令别名、管道、重定向和历史记录等功能。 2. 常用命令:包括ls(列出目录内容)、cd(切换目录)、cat(查看文件内容)、cp/mv(复制/移动文件)、rm(删除文件)、mkdir/rmdir(创建/删除目录)等。 五、...

Global site tag (gtag.js) - Google Analytics