从shell/终端调用脚本和使用Java进程有什么区别?

从shell/终端调用脚本和使用Java进程有什么区别?,java,ruby,shell,command-line,Java,Ruby,Shell,Command Line,我在试图让ruby脚本通过Java运行时遇到了实际问题。我已经提出了各种各样的解决方案,但由于某种原因,它们都失败了,所以我试图简化我的问题 假设我有一个shell脚本,其中只有一行: ruby -rubygems script/test_s2t.rb 在终端,我可以使用script/runruby.sh运行这个脚本,它可以按预期工作。现在让我们假设我有一个Java方法,它执行以下操作: String[] cmd = {"script/runruby.sh"}; ProcessBuilder

我在试图让ruby脚本通过Java运行时遇到了实际问题。我已经提出了各种各样的解决方案,但由于某种原因,它们都失败了,所以我试图简化我的问题

假设我有一个shell脚本,其中只有一行:

ruby -rubygems script/test_s2t.rb
在终端,我可以使用
script/runruby.sh
运行这个脚本,它可以按预期工作。现在让我们假设我有一个Java方法,它执行以下操作:

String[] cmd = {"script/runruby.sh"};
ProcessBuilder builder = new ProcessBuilder(cmd);
builder.redirectErrorStream(true);
Process process = builder.start();
这不起作用(它会从Ruby脚本中抛出一个错误,具体来说,但这是一个误导,因为这实际上是由于脚本本身没有按预期工作)。我的问题不是为什么
test_s2t.rb
脚本不起作用,因为我认为这可能会分散我对真正问题的注意力

我的问题很简单,当我通过ProcessBuilder运行某个东西时,与仅仅通过命令行运行它相比,有什么不同。这是一件好事吗?路径差异?脚本运行的环境一定有问题,因为我看不出脚本本身有问题

如前所述,任何建议都将不胜感激。三天,就在这个问题上

编辑-对于那些好奇的人来说,我在Java中收到的确切错误就是这个问题底部描述的错误:

我们在这个问题上得到的结果是,我应该尝试JRuby,但这导致了进一步的问题,因为我无法让gems在JRuby中正常工作。所以我又问自己为什么它一开始就不能正常运行

我之所以认为这个错误会分散注意力,是因为给出这个错误仅仅是因为它处理了一个它不希望看到的字符串。它所期望的字符串是脚本运行的正常进程,它使用ffmpeg等。这意味着脚本遇到了另一个错误(它没有显示,这意味着它可能不是由ruby/jruby引起的,而是由脚本启动的进程(如ffmpeg)引起的)


这令人难以置信地沮丧,纯粹是因为它在命令行中运行得如此完美。

我遇到过类似的问题,有两件事似乎是常见的问题:

1) 子进程的环境将与当前虚拟机的环境相同。这包括已启动进程的工作目录

示例来自:

Map env=pb.environment();
环境看跌期权(“VAR1”、“myValue”);
环境移除(“其他变量”);
环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
pb.目录(“myDir”);
或者,您可以在shell脚本中设置环境

2) 你们有合适的shebang吗!在.sh文件的开头?就我个人而言,我会说得非常清楚,可能会显式地调用bash或zsh,或者以shell脚本的路径作为第一个参数,或者直接以“-rubygems”和“script/test_s2t.rb”作为参数调用ruby


祝你好运

我遇到过类似的问题,有两件事似乎是常见的问题:

1) 子进程的环境将与当前虚拟机的环境相同。这包括已启动进程的工作目录

示例来自:

Map env=pb.environment();
环境看跌期权(“VAR1”、“myValue”);
环境移除(“其他变量”);
环境put(“VAR2”,环境get(“VAR1”)+“后缀”);
pb.目录(“myDir”);
或者,您可以在shell脚本中设置环境

2) 你们有合适的shebang吗!在.sh文件的开头?就我个人而言,我会说得非常清楚,可能会显式地调用bash或zsh,或者以shell脚本的路径作为第一个参数,或者直接以“-rubygems”和“script/test_s2t.rb”作为参数调用ruby


祝你好运

虽然这可能会分散你对真实问题的注意力,但你从脚本中得到的错误是什么?ProcessBuilder在与其自身相同的环境中执行进程,我将在错误中进行编辑,并给出一些解释。完成。虽然这可能会分散你对真实问题的注意力,但你从脚本中得到的错误是什么?ProcessBuilder在与其自身相同的环境中执行进程,我将在错误中进行编辑,并给出一些解释。完成。谢谢你的这些-我明天会试用,然后再给你回复!关于第二个建议,我实际上将这个ruby调用移动到了一个脚本中,这样我可以简化这个问题,之前我尝试直接调用ruby,但没有骰子。所以我不认为是这样。不过我会调查一下当地的环境。工作目录很好,但可能有些变量没有设置…你是个漂亮的WO/MAN。哦,老兄。我真不敢相信这会奏效。ProcessBuilder的$PATH和Mac的$PATH之间存在巨大差异。一旦我正确设置了PB的path变量,它就会立即运行。我迫不及待地想推进这个项目。非常感谢你,非常感谢。谢谢你的这些-我明天会试用,然后再给你回复!关于第二个建议,我实际上将这个ruby调用移动到了一个脚本中,这样我可以简化这个问题,之前我尝试直接调用ruby,但没有骰子。所以我不认为是这样。不过我会调查一下当地的环境。工作目录很好,但可能有些变量没有设置…你是个漂亮的WO/MAN。哦,老兄。我真不敢相信这会奏效。ProcessBuilder的$PATH和Mac的$PATH之间存在巨大差异。一旦我正确设置了PB的path变量,它就会立即运行。我迫不及待地想推进这个项目。非常感谢你。