У меня есть сценарий оболочки в другом каталоге, чем мои файлы java. Этот сценарий содержит только ls, который печатает файлы в текущем каталоге. Когда я запускаю проект Java, он печатает файлы в корне проекта Java, а не в корне сценария оболочки. Я хочу, чтобы он распечатал файлы в корне сценария оболочки.

Код Java:

ProcessBuilder pb = new ProcessBuilder("/home/omar/ros_ws/baxter3.sh");
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = null;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
-1
Omar Amr 18 Апр 2016 в 11:08

3 ответа

Лучший ответ

Используйте ProcessBuilder.directory, вы, вероятно, захотите

String path = "/home/omar/ros_ws/baxter3.sh";
ProcessBuilder pb = new ProcessBuilder(path);
pb.directory(new File(path).getParent());
0
webbertee 18 Апр 2016 в 08:17

Затем вы должны установить рабочий каталог вашего экземпляра ProcessBuilder на каталог, который вы хотите наблюдать. Вы можете сделать это, используя его метод directory(File directory). См. Javadoc ProcessBuilder

Поэтому перед pb.start() определите файл для своего каталога и назначьте его экземпляру ProcessBuilder.

        File myDir = new File("/home/omar/ros_ws");
        pb.directory(myDir);
        pb.start();
1
Loic Mouchard 18 Апр 2016 в 08:19

Простое решение: команду ls можно запускать с несколькими аргументами. Один из них - это аргумент файла, который может быть каталогом.

На ls справочной странице:

# List the contents of your home directory
$ ls ~

Таким образом, просто передайте вашему сценарию оболочки каталог, который вы жестко запрограммировали в своем java-коде: "/home/omar/ros_ws/", и получите доступ к нему в сценарии оболочки через $1.

Итак, ваш сценарий оболочки будет выглядеть примерно так:

#!/bin/bash
ls $1

И вызовите свой сценарий оболочки из java через:

ProcessBuilder pb = new ProcessBuilder("/home/omar/ros_ws/baxter3.sh /home/omar/ros_ws/");
// other code omitted for brevity
0
Jonny Henly 18 Апр 2016 в 08:20