Запуск сценария оболочки из внешнего каталога: нет такого файла или каталога

4

У меня есть файл оболочки 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, но все же он не говорит об этом файле или директории.

Что я делаю неправильно?

Спасибо.

  • 1
    Java пытается запустить вашу ВСЮ командную строку как одну команду. Строка cat /home/... - это не программа, а cat , а остальное - аргумент для cat.
  • 1
    Марк Б, вероятно, прав, и я не Java-парень, поэтому я, вероятно, хотел бы проверить разрешения для /home/kemallin/Desktop/capture-03.csv и /home/kemallin/Desktop/clean.sh , Убедитесь, что пользователь, работающий с java-программой, имеет доступ к этим файлам (+ rwx, если вы просто хотите отменить проблему с разрешениями ... если это так, то вы можете работать оттуда)
Показать ещё 3 комментария
Теги:

2 ответа

12
Лучший ответ

Ваша программа 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();
    }
}
  • 0
    Это решило некоторую часть проблемы. Спасибо, я обновил вопрос соответственно.
  • 0
    Моя ошибка это полностью исправила.
1

Вы должны сделать chmod 755 /home/kemallin/Desktop/clean.sh и обеспечить, чтобы java-процесс запускался под одним и тем же идентификатором пользователя

  • 0
    Он по-прежнему говорит "нет такого файла или каталога".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню