使用Java'运行.sh文件;s exec在不同的目录中?

使用Java'运行.sh文件;s exec在不同的目录中?,java,shell,unix,runtime.exec,Java,Shell,Unix,Runtime.exec,我正在编写一个Java程序MyAwesomeProgram,它使用Process的exec函数在本地运行bash命令。我的代码位于/home/a/b/c,在/home/a/b/d中有.sh文件需要运行。但是,当我运行代码时: Process p; Runtime rt = new Runtime.getRuntime(); p = rt.exec("./home/a/b/d/shell.sh"); p.waitFor(); 我收到一个错误: Exception in thread "main"

我正在编写一个Java程序MyAwesomeProgram,它使用Process的exec函数在本地运行bash命令。我的代码位于/home/a/b/c,在/home/a/b/d中有.sh文件需要运行。但是,当我运行代码时:

Process p;
Runtime rt = new Runtime.getRuntime();
p = rt.exec("./home/a/b/d/shell.sh");
p.waitFor();
我收到一个错误:

Exception in thread "main" java.io.IOException: Cannot run program "./home/a/b/d/shell.sh": java.io.IOException: error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
at java.lang.Runtime.exec(Runtime.java:593)
at java.lang.Runtime.exec(Runtime.java:431)
at java.lang.Runtime.exec(Runtime.java:328)
at MyAwesomeProgram.main(MyAwesomeProgram.java:186)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
at java.lang.ProcessImpl.start(ProcessImpl.java:65)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
线程“main”java.io.IOException中的异常:无法运行程序“/home/a/b/d/shell.sh”:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 位于java.lang.Runtime.exec(Runtime.java:593) 位于java.lang.Runtime.exec(Runtime.java:431) 位于java.lang.Runtime.exec(Runtime.java:328) 在MyAwesomeProgram.main(MyAwesomeProgram.java:186) 原因:java.io.IOException:java.io.IOException:error=2,没有这样的文件或目录 位于java.lang.UNIXProcess(UNIXProcess.java:148) 在java.lang.ProcessImpl.start(ProcessImpl.java:65) 位于java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 我相信这只是格式化exec命令字符串时的一个错误,但是到目前为止我还没有找到解决方案。我哪里搞砸了?任何其他有效使用exec的提示/技巧都将不胜感激,但完全是可选的。谢谢


编辑:我让代码正常工作了,这是一个问题,因为我向后得到了一些目录引用,以及Woot4Moo所说的内容。

如果您的程序位于:

/home/a/b/c
而您的脚本则存在于:

/home/a/b/d
您使用的
目录不正确。您要使用以下路径执行它:

../d/script.sh
说明使用当前目录+字符串。因此,本质上,您的输入是以下内容:

/home/a/b/c/home/a/b/d
允许您进入一个目录,如果您位于:

/home/a/b/c
然后,您需要到达:

/home/a/b

你有没有试过不穿衣服。?如果您的代码是从/home/a/b/c运行的,那么/home/a/b/c/home/a/b/d/shell.sh请说明如何从命令行运行此代码。包括您当前的目录(即/home/chris)javac MyAwesomeProgram.java,javamyawesomeprogram。main方法包含代码(这是一个虚拟程序,用于在我将exec功能合并到一个已经测试过的更大程序组中之前测试exec功能)。所有必需的东西都已经导入并测试了,可以按预期工作。哦,如果我误解了你的意思,那么很抱歉,你指的是实际的命令,而不是我从/home/a/b/c/as运行它的程序。正如你在下面的回答中所说的那样。./d/script.sh。我更新了代码以反映你的建议,我得到了相同的java.io.IOException,除了“./home/a/b/d/script.sh“尽管它在终端手动工作。有什么想法吗?文件的权限是什么?你以什么用户的身份运行代码?权限是755,我有接近root的权限,但没有root权限。我应该能够操作/删除/等所有有问题的文件,所以我认为这不是权限问题。整个代码只是创建一个进程、运行时,然后是exec调用,所以我没有什么可以遗漏的。