无法运行Shell脚本

时间:2011-11-21 07:43:56

标签: java cygwin

我正在尝试使用Cygwin从我的Windows操作系统运行shell脚本。当我从命令提示符运行时,它正常工作,因为我去洞察 C:\ cygwin \ bin 并运行 sh my_script.sh

当我通过代码获取以下错误时尝试此操作

C:\Java\jdk1.6\bin>java CmdProcessBuilder
Exception in thread "main" java.io.IOException: Cannot run program "C:\cygwin\bi
n\my_script.sh": CreateProcess error=193, %1 is not a valid Win32 application
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
        at CmdProcessBuilder.main(CmdProcessBuilder.java:13)
Caused by: java.io.IOException: CreateProcess error=193, %1 is not a valid Win32
 application
        at java.lang.ProcessImpl.create(Native Method)
        at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
        at java.lang.ProcessImpl.start(ProcessImpl.java:30)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
        ... 1 more

以下是代码:

public static void main(String args[])
     throws InterruptedException,IOException
  {
    List<String> command = new ArrayList<String>();
    command.add(System.getenv("cygwin") +"\\bin\\"+"sh my_script.sh");

    ProcessBuilder builder = new ProcessBuilder(command);

    final Process process = builder.start();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
    System.out.println("Program terminated!");
  }

当我在命令提示符下尝试 cd cygwin \ bin \ sh my_script.sh 时,它没有执行给出错误消息msg 系统找不到指定的路径。

3 个答案:

答案 0 :(得分:1)

使用Runtime.exec这样的运气可能会更好:

String fs = System.getProperty("file.separator");
String command = System.getenv("cygwin") + fs + "bin" + fs + "sh my_script.sh";

Process p = Runtime.getRuntime().exec(command);

最好避免在路径中使用依赖于平台的字符串。

答案 1 :(得分:0)

您是否尝试用

替换命令?
./cygdrive/c/cygwin/bin/my_script.sh

?如果你想从你的拥有,你可能需要用

替换你的命令
command.add(System.getenv("cygwin") +"\\\\bin\\\\"+"sh my_script.sh");

执行

  C:\cygwin\\bin\\my_script.sh  

这是如何在cygwin中使用windows样式路径。

答案 2 :(得分:0)

我注意到你的构造有一点是你可能没有正确构建命令字符串。阅读ProcessBuilder文档(之前没有使用过这个文档),你正在构建一个带有List of Strings的进程命令,但是第一个字符串是命令,其他是参数。你构建comamnd的方式:

List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh " + "my_script.sh"); 

ProcessBuilder builder = new ProcessBuilder(command);

似乎创建了 包含 脚本名称的命令名称。将通话更改为:

List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh ");
command.add("my_script.sh"); 

ProcessBuilder builder = new ProcessBuilder(command);

并检查错误。然后,检查是否找不到c:\ cygwin \ bin \ sh.exe或者找不到脚本本身的问题。你提到尝试失败的 cd ,那么相对于java类文件的 my_script.sh 脚本在哪里?当您调用 sh 命令时,它可能无法找到 my_script.sh 文件,因为工作目录可能不在您认为的位置。

您可能尝试的一件事是确定 sh.exe 认为它正在运行的位置。从您的Java代码中,您应该可以使用以下命令调用shell:

  List<String> command = new ArrayList<String>();
  String fs = System.getProperty("file.separator");
  command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
  command.add("-c");
  command.add("pwd"); 

这个输出应该是shell命令认为它正在运行的目录。如果这不是实际 my_script.sh 的位置,您可能需要完全路径到脚本本身(作为cygwin格式的示例路径)

  command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
  command.add("/usr/local/scripts/my_script.sh");

这是我开始调试的地方。