Running the Shell Shell From an external directory: no such file or directory

I have a shell script file that I want to run from java. My java workspace directory is different from the script 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, and every decision pretty much indicates that I'm doing the right thing.

I tried to put the script file in src and in the bin of the Java project, but still it does not talk about this file or directory.

What am I doing wrong?

Thanks.

+4
source share
2 answers

Your clean.sh program clean.sh not executable, as Java understands, although the underlying system understands it as executable.

You need to tell Java which shell is needed to execute your command. Do (if you use bash and it is installed in /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(); } } 
+12
source

You should make chmod 755 /home/kemallin/Desktop/clean.sh and ensure that the java process starts under the same user ID

+1
source

All Articles