Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java运行shell脚本(包含wget)_Java_Shell - Fatal编程技术网

从Java运行shell脚本(包含wget)

从Java运行shell脚本(包含wget),java,shell,Java,Shell,我正在尝试从Java执行一个shell脚本。该脚本应该使用wget从URL下载文件。下面是我的代码 public class RunShellScriptFromJava { public static void main(String a[]) { try { ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh"); Proc

我正在尝试从Java执行一个shell脚本。该脚本应该使用wget从URL下载文件。下面是我的代码

     public class RunShellScriptFromJava {
         public static void main(String a[]) {
         try {
              ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh");
              Process p = pb.start();
              p.waitFor();
              System.out.println("Success");
         } catch (Exception e) {
         e.printStackTrace();
      }
     }
    }
script.sh的内容

     echo "start"
     wget http://alex.smola.org/drafts/thebook.pdf
     echo "end"
我的问题: 这是正确的方法吗?如果不是,请为我指出正确的方向。它不会引发任何异常,但我看到文件没有下载。任何线索/帮助都将不胜感激

谢谢


PS:我已经为脚本授予了执行权限

这个脚本和java示例可以工作,也许可以指定wget的完整路径,以确保您知道pdf保存的位置

$ javac RunShellScriptFromJava.java
$ java RunShellScriptFromJava
Success
$ ls
RunShellScriptFromJava.java  thebook.pdf RunShellScriptFromJava.class  script.sh
示例/更新脚本:

wget -O /home/MYSER/test.pdf http://alex.smola.org/drafts/thebook.pdf

问题中的代码示例在使用方面缺乏错误处理,因此可能发生了某种错误,但您无法了解它

将忽略的返回代码。返回的值是生成的进程的退出代码。我建议检查此值是否为非零

也没有对stdout或stderr的处理,因此您不知道生成的进程是否正在编写任何解释所发生情况的输出。您可以分别使用和访问stdout和stderr

还请注意,如果进程未能完全使用流,或者至少无法重定向流,则进程可能会挂起。我注意到这个问题在Windows上特别常见。一种标准技术是生成后台线程来使用流。前一个问题讨论了该技术和其他技术


在Java代码中的错误处理得到这样的增强后,我希望您有更好的机会诊断脚本的错误。

正确的方法是使用Java下载文件,而不是使用shell脚本。shell脚本的问题在于它们依赖于系统。通过使用它们,您失去了java的主要优点之一,即系统独立性。Java中有许多库可以实现这一功能。以下内容适用于使用ApacheIO Commons中的FileUtils类

URL url = new URL("http://alex.smola.org/drafts/thebook.pdf");
File download = new File('.');
FileUtils.copyURLToFile(url, download);

从Java运行的脚本无法获得正常的shell环境。要么重写脚本使其在没有它的情况下工作(即完整路径所有内容),要么查看链接副本,了解如何为
ProcessBuilder
设置环境。哦,是的。这就是我所缺少的!我这样指定了位置。wget-P/用户/Ashray/编码/测试。它出现了!谢谢!:)伟大的Chris Nauroth关于检查错误代码的建议是合理的建议,您也应该这样做。是的!我只是检查这是否可行。在我的项目中,我会考虑这些问题,谢谢宝贵的建议。我会在实际的执行中牢记: