【问题标题】:executing within java a commandline bash command with no output is not executed like在java中执行没有输出的命令行bash命令不会像执行
【发布时间】:2013-08-24 01:54:55
【问题描述】:

使用此代码:

   private String executeCommand(String cmd ) {

    Process p;
    try {
        p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = new BufferedReader(
            new InputStreamReader(p.getInputStream()));

        while ((commandlineOutput = br.readLine()) != null){
                System.out.println("line:" + commandlineOutput);
             }
        p.waitFor();
                System.out.println (p.exitValue());

        p.destroy();
    } catch (Exception e) {}

  }
return commandlineOutput;
}

我遇到以下问题:所有产生一些输出的命令都正常执行,但是一些不产生输出的命令没有执行 例如: rm *.jpg 不工作,但 mkdir 是,我看不出区别

我是个新手,在 Google 上搜索了一段时间,但从未提及过这个特殊问题 请帮帮我 谢谢

【问题讨论】:

  • 通过运行rm *.jpg,您期望得到什么样的输出?您是否检查过该命令是否正在运行?
  • rm *.jpg 从命令行使用时不会对用户产生任何反馈,它只会删除当前目录中的所有 jpg 文件。将 java 程序生成的命令复制粘贴到命令行时,它可以正常工作 rm *.jpg 的退出输出为 1,mkdir somedir 的退出代码为 0

标签: java command-line execution


【解决方案1】:

当您在 linux 上运行 rm * 时,shell 会解释并处理 *。在 Java 中,没有运行相同的 shell,因此 * 不会被解释为通配符。

正如here 所指出的,尝试从cmd 输入中提取目标/工作目录并执行以下操作:

File[] files = new File(<directory>).listFiles();
for(File file : files){
  if(file.getAbsolutePath().endsWith(".jpg")){
      //perform delete
  }
}

或者,您可以尝试(未测试,因为我现在没有 linux 机器):

String[] command = new String[] {"rm", "*.jpg"}
p = Runtime.getRuntime().exec(command);

【讨论】:

  • executeCommand ("rm" + FieldGraphicsDir.getText() + "/" + "*.jpg");是输入到 executeCommand 方法中的命令
【解决方案2】:

如果出现错误会转到 ErrorStream ,您还需要附加该错误:

BufferedReader bre = new BufferedReader
        (new InputStreamReader(p.getErrorStream()));

【讨论】:

  • @allard 检查此相关帖子:stackoverflow.com/questions/3343066/…
  • 正如我所说,我是个新手,但我在隧道尽头看到了一些亮光,它是关于 * 的,对吗?
  • ** 好的,我解决了... ** String [] cmds = {"bash", "-c", cmd}; ProcessBuilder probuilder = new ProcessBuilder( cmds );
猜你喜欢
  • 2015-06-17
  • 2013-10-01
  • 2018-01-16
  • 2011-12-11
  • 1970-01-01
  • 2017-05-03
  • 2019-06-22
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多