Viktor
Viktor

Reputation: 1487

Cannot execute a Linux command from Java

I have a Linux command that I cannot execute from Java:

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

It works fine in command line but when I use the following code:

    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);
    }

it says that

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

Any idea? Is it possible that these IF bash operators cannot be called from Java...?

Thanks!

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

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

Upvotes: 3

Views: 883

Answers (1)

DodgyCodeException
DodgyCodeException

Reputation: 6143

The [ command is a shell built-in. The which command shows that it's also an executable file. It is this executable file that gets executed when you pass the command line to exec(). So then the whole command line is passed to the [ command. However, the && operator is a shell operator. The [ executable doesn't like it.

So you need to run the bash executable and pass the command as an argument:

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

Upvotes: 1

Related Questions