无法在Java中执行Linux命令

3

我有一个Linux命令,在Java中无法执行:

[ ! -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 ']'

有任何想法吗?这些IF bash运算符无法从Java中调用,可能吗...?
谢谢!
**************** 更新 ****************
vikhor@adnlt653-vm1:~> which '['
[ is a shell builtin
[ is /usr/bin/[
[ is /bin/[

1
我认为在Linux上没有名为“ [ ”的可执行文件可以完成你想要的操作。而且,你真的想使用外部命令来检查某个目录是否存在吗? - Gyro Gearless
嗨@spandey15,是的,我在同一主机上。 - Viktor
1
嗨@GyroGearless,基本上它是一个IF运算符,它尝试检查文件夹是否存在。在命令行中它工作得很好。通常它用于bash脚本中。 - Viktor
嗨,你说得对,谢谢!状态值为2。据我所知,这只意味着命令未能执行成功,是这样吗? - Viktor
尝试将该命令放入脚本文件中并执行。您可能需要先使用chmod +x命令更改其权限。虽然不是非常安全,但应该可以工作。 - Konstantinos
显示剩余4条评论
1个回答

1
"

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

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

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

嗨,谢谢,你肯定是对的!然而我不能证明它,因为当我执行上面的命令时,我会遇到以下错误:!: -c:第0行:在寻找匹配''时意外遇到EOF!: -c:第1行:语法错误:意外的文件结尾 - Viktor
你的错误信息显示“在查找匹配`时出现意外的EOF”。那是一个反引号字符。请确保你使用的是直引号。 - DodgyCodeException
好的,奇怪的是命令中没有反引号,只有撇号(我复制了你提供的命令)。无论如何,你的答案是正确的,所以我会接受它。 - Viktor
1
最终,bash -c 是解决方案,但你的答案是关键,再次感谢! - Viktor
很高兴能够帮到你。感谢指出正确的命令应该是什么。我已经编辑了答案,以便于未来的读者受益。 - DodgyCodeException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接