【问题标题】:problem while running shell script using java使用java运行shell脚本时出现问题
【发布时间】:2010-10-11 05:27:17
【问题描述】:

我在/tmp/padm 文件夹中有一个名为test.sh 的shell 脚本。 在那个 shell 脚本中,我有一个语句

echo "good"

我正在尝试使用 Java 代码运行 shell 脚本。

String cmd=("/tmp/padm/.test.sh");            
Runtime rt = Runtime.getRuntime();
Process pr=rt.exec(cmd);

但我的问题是我看不到 shell 脚本的输出“好”。

如何让脚本运行?

【问题讨论】:

  • 我不确定你的问题是什么,所以我猜测了一下。如果我猜错了,请再次编辑。

标签: java linux shell


【解决方案1】:

试试这个,一定会成功的。

Shell 脚本 test.sh 代码

   #!/bin/sh
   echo "good"

执行shell脚本test.sh的Java代码

          try {
                Runtime rt = Runtime.getRuntime();
                Process pr = rt.exec(new String[]{"/bin/sh", "/tmp/padm/.test.sh"});

                BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
                String line = "";
                while ((line = input.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                System.out.println(e.toString());
                e.printStackTrace();
            }

【讨论】:

    【解决方案2】:

    这是Need sample java code to run a shellscript 的副本。

    我的答案中的示例程序确实打印出标准错误和标准输出(示例程序稍后添加)。

    请注意,streamGobbler 在单独的线程中运行,以防止由于输入/输出缓冲区满而导致的执行问题。

    如果您愿意,当然可以让 StreamGobblers 将输出存储在列表中,并在进程执行后检索列表,而不是将其直接转储到 stdout。

    【讨论】:

      【解决方案3】:

      您可以使用以下代码获得命令输出。希望这会有所帮助。

      Process process = Runtime.getRuntime().exec(cmd);
      String s = "";
      BufferedReader br = new BufferedReader(new InputStreamReader(process
                  .getInputStream()));
      while ((s = br.readLine()) != null)
      {
         s += s + "\n";
      }    
      System.out.println(s);
      
      BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
      while (br2.ready() && (s = br2.readLine()) != null)
      {
        errOutput += s;
      }
      System.out.println(errOutput);
      

      【讨论】:

        【解决方案4】:
        process.getErrorStream();
        process.getOutputStream();
        

        oxbow_lakes 指出的正确方法。

        另外,请确保您执行 /bin/sh 时将 shell 脚本位置作为参数。

        【讨论】:

          【解决方案5】:

          当您说“在终端上”时,您是什么意思?如果您想查看流程的输出/错误,您需要使用:

          process.getErrorStream();
          process.getOutputStream();
          

          除此之外,从您使用Runtime.exec 调用shell 脚本我可以看出没有问题

          【讨论】:

          • 我应该看到终端,然后是输出
          • 你是指斯皮尔伯格的电影:“终点站”吗?还是我们在这里谈论另一个终端?
          • @oxbow_lakes:在 Windows 中称为命令提示符窗口,在 Linux 中称为 shell 或终端。同样的事情。
          • 我不认为他是那个意思;听起来当他在 linux 上运行某些东西时,他期待某个窗口会神奇地弹出某个地方。当您使用 java 而不是 javaw 时,就像在 Windows 机器上一样。
          • 太获取进程的输出,需要getInputStream,而不是getOutputStream...
          【解决方案6】:

          那是行不通的。您必须在脚本的第一行添加“hash bang”,以告诉 Linux 它必须使用合适的解释器(例如 bash)来解释脚本,或者从 Java 显式通过 bash 运行它。

          【讨论】:

          • 我不明白...你怎么知道他的shell脚本里有什么?他没发过
          • String [] cmd = {"cmd.exe", "/C","D:/Development/saveReport.bat"} 它打开命令提示符并执行 batach 文件 同样的事情运行批处理文件时需要做的事情
          • 我不确定在 linux 环境中是否有类似的东西!执行我的建议并使用 process.getOutputStream() 获取流程输出。
          • @oxbow_lakes:哦?我将“在 shell 脚本中我有以下回声“好””解释为脚本列表,即它只是一个回声。
          • 如果脚本是可执行的,它应该可以工作。使用 #! 可能会更快(少一个失败的系统调用),但如果没有它也应该可以工作。
          猜你喜欢
          • 1970-01-01
          • 2019-12-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-28
          • 2021-08-03
          • 1970-01-01
          • 2015-09-12
          • 2020-08-14
          相关资源
          最近更新 更多