У меня есть файл оболочки script, который я хочу запустить из java. Мой каталог рабочего пространства java отличается от каталога script.
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();
}
}
и я получаю эту ошибку:
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)
У меня есть googled, и каждое решение в значительной степени указывает, что я поступаю правильно.
Я попытался поместить файл script в src и в bin проекта Java, но все же он не говорит об этом файле или директории.
Что я делаю неправильно?
Спасибо.
Ваша программа clean.sh
не является исполняемым, как это понимает Java, хотя базовая система понимает ее как исполняемую.
Вам нужно сообщить Java, какая оболочка необходима для выполнения вашей команды. Сделайте (если вы используете bash
и он установлен в /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();
}
}
Вы должны сделать chmod 755 /home/kemallin/Desktop/clean.sh
и обеспечить, чтобы java-процесс запускался под одним и тем же идентификатором пользователя
cat /home/...
- это не программа, аcat
, а остальное - аргумент для cat./home/kemallin/Desktop/capture-03.csv
и/home/kemallin/Desktop/clean.sh
, Убедитесь, что пользователь, работающий с java-программой, имеет доступ к этим файлам (+ rwx, если вы просто хотите отменить проблему с разрешениями ... если это так, то вы можете работать оттуда)