【问题标题】:Cannot execute a Linux command from Java无法从 Java 执行 Linux 命令
【发布时间】:2023-08-13 11:37:01
【问题描述】:

我有一个无法从 Java 执行的 Linux 命令:

[ ! -d "/tmp/flow" ] && echo "The directory DOES NOT exist."

它在命令行中运行良好,但是当我使用以下代码时:

    String command = "[ ! -d \"/tmp/flow\" ] && echo \"The directory DOES NOT exist.\"";
    Process proc = Runtime.getRuntime().exec(command);
    Boolean successful = proc.waitFor()==0 && proc.exitValue()==0;
    System.out.println("successful:"+successful);
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

    String line = null;
    System.out.println("************** input");
    while ((line = stdInput.readLine()) != null) {
        System.out.println(line);
    }
    System.out.println("************** error");
    while ((line = stdError.readLine()) != null) {
        System.out.println(line);
    }

它是这么说的

successful:false
************** input
************** error
[: missing ']'

有什么想法吗?是否有可能无法从 Java 调用这些 IF bash 运算符...?

谢谢!

**************** UDATE ****************

vikhor@adnlt653-vm1:~> which '['
[ is a shell builtin
[ is /usr/bin/[
[ is /bin/[

【问题讨论】:

  • 您是否在尝试执行提及命令的同一框中。如果外面尝试使用 jsch 或任何其他 libaray
  • 我认为 Linux 上没有一个名为“[”的可执行文件可以满足您的需求。您真的要使用外部命令检查某个目录是否存在吗?
  • 嗨@spandey15,是的,我在同一个主机上。
  • 嗨@GyroGearless,基本上它是一个IF运算符,它会尝试检查文件夹是否存在。它在命令行中运行良好。通常用于 bash 脚本中。
  • Boolean successful = proc.waitFor()==0 && proc.exitValue()==0; 如果您刚刚检查了waitFor() 的返回,则无需检查exitValue(),因为它们将是相同的。打印实际的 int 值,而不是创建布尔对象。

标签: java linux bash


【解决方案1】:

[ 命令是一个内置的 shell。 which 命令表明它也是一个可执行文件。当您将命令行传递给exec() 时,会执行此可执行文件。因此,整个命令行被传递给[ 命令。但是,&& 运算符是一个 shell 运算符。 [ 可执行文件不喜欢它。

所以你需要运行bash 可执行文件并将命令作为参数传递:

String command = "bash -c '[ ! -d \"/tmp/flow\" ] && echo \"The directory DOES NOT exist.\"'";

【讨论】:

  • 嗨,谢谢,你一定是对的!但是我无法证明这一点,因为在执行上面的命令时出现以下错误: !: -c: line 0: unexpected EOF while looking for matching `'' !: -c: line 1: syntax error: unexpected end文件
  • 您的错误消息显示“在寻找匹配的 ` 时出现意外的 EOF”。那是一个反引号字符。确保您使用的是直引号。
  • 嗯,奇怪的是命令中没有反引号,只有撇号(我复制了你提供的命令)。无论如何,你的答案是正确的,所以我会接受它。
  • 最终 bash -c 是解决方案,但您的回答是关键,再次感谢!
  • 很高兴它有帮助。并感谢您指出正确的命令应该是什么。为了任何未来的读者,我已经编辑了答案。
最近更新 更多