【问题标题】:Running .sh files with Java's exec in a different directory?在不同的目录中使用 Java 的 exec 运行 .sh 文件?
【发布时间】:2012-04-10 18:02:03
【问题描述】:

我正在编写一个 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)

我相信这只是格式化 exec 命令字符串的一个错误,但是到目前为止我还没有找到解决方案。我哪里搞砸了?任何其他有效使用 exec 的提示/技巧将不胜感激,但完全是可选的。谢谢!

编辑:我的代码工作正常,这是我得到的几个目录引用以及 Woot4Moo 所说的问题。

【问题讨论】:

  • 你试过不带 .?如果你的代码是从 /home/a/b/c 运行的,那就是 /home/a/b/c/home/a/b/d/shell.sh
  • 请发布您如何从命令行运行它。包括您当前的目录(即 /home/chris)
  • javac MyAwesomeProgram.java,java MyAwesomeProgram。 main 方法包含代码(这是一个虚拟程序,用于在我将其合并到更大的已测试程序组之前测试 exec 功能)。一切必要的东西都已经导入并经过测试,可以按预期工作。
  • 对不起,如果我误解了,你的意思是实际的命令,而不是我从 /home/a/b/c/ 作为“../d/script.sh”运行它的程序您在下面的答案中发布了。

标签: java shell unix runtime.exec


【解决方案1】:

如果你的程序存在于:

/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

【讨论】:

  • 我更新了代码以反映您的建议,我得到了相同的 java.io.IOException,除了“../home/a/b/d/script.sh”,尽管它手动工作终端。有什么想法吗?
  • 文件的权限是什么?您以什么用户身份运行代码?
  • 权限为 755,我有近根权限但不是根权限。我应该能够操作/删除/等所有有问题的文件,所以我认为这不是权限问题。整个代码只是创建一个进程、运行时,然后是 exec 调用,所以我没有什么可以遗漏的。
猜你喜欢
  • 2017-11-06
  • 2016-08-08
  • 2020-07-18
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多