saccu
saccu

Reputation: 117

Running Shell Script From External Directory: No such file or directory

I have a shell script file that i want to run from java. My java work space directory is different than the script's directory.

private final String scriptPath = "/home/kemallin/Desktop/";

public void cleanCSVScript() {

    String script = "clean.sh";
    try {
        Process awk = new ProcessBuilder(scriptPath + script).start();
        awk.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

and i get this error:

java.io.IOException: Cannot run program "cat /home/kemallin/Desktop/capture-03.csv | awk -F ',' '{ print $1,",", $2,",", $3,",", $4,",", $6}' > clean.csv": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at ShellScript.cleanCSVScript(ShellScript.java:21)
at Main.main(Main.java:15)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 2 more
java.io.FileNotFoundException: /home/kemallin/Desktop/clean.csv (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
at CSVReader.run(CSVReader.java:25)
at Main.main(Main.java:17)

I have googled it and every solution pretty much indicate that i'm doing the right thing.

I have tried to put the script file in the src and in bin of the Java project but still it says no such file or dir.

What am i doing wrong?

Thanks.

Upvotes: 7

Views: 25805

Answers (2)

Romeo Kienzler
Romeo Kienzler

Reputation: 3537

You should do a chmod 755 /home/kemallin/Desktop/clean.sh and ensure the java process is run under the same userid

Upvotes: 1

David P. Caldwell
David P. Caldwell

Reputation: 3829

Your program clean.sh is not an executable as Java understands it, even though the underlying system understands it as executable.

You need to tell Java what shell is needed to execute your command. Do (assuming you are using bash and it is installed at /bin/bash):

private final String scriptPath = "/home/kemallin/Desktop/";

public void cleanCSVScript() {

    String script = "clean.sh";
    try {
        Process awk = new ProcessBuilder("/bin/bash", scriptPath + script).start();
        awk.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Upvotes: 15

Related Questions